2010-09-07 126 views
12

Actualmente estoy usando un ayudante link_to en Ver para pasar parámetros como el título, el autor, image_url e ISBN vuelta al controladorRuby on Rails: Cómo pasar parámetros a la vista al controlador con link_to sin parámetros que muestran en el URL

<%= link_to 'Sell this item',new_item_path(:title => title, :author => authors, :image_url=>image, :image_url_s=>image_s, :isbn=>isbn, :isbn13=>isbn13) %> 

controlador entonces asignar los parámetros a un objeto para ser utilizado por un formulario en vista más tarde (en new.html.erb)

def new 
     @item = Item.new 

     @item.title = params[:title] 
     @item.author = params[:author] 
     @item.image_url = params[:image_url] 
     @item.image_url_s = params[:image_url_s] 
     @item.isbn = params[:isbn] 
     @item.isbn13 = params[:isbn13] 

     respond_to do |format| 
     format.html # new.html.erb 
     format.xml { render :xml => @item } 
     end 
end 

new.html.erb a continuación, se llama. Esto es todo funciona bien, pero la url muestra todos los parámetros

http://localhost:3000/items/new?author=Michael+Harvey&image_url=http://ecx.images-amazon.com/images/I/51vt1uVjvLL._SL160_.jpg&image_url_s=http://ecx.images-amazon.com/images/I/51vt1uVjvLL._SL75_.jpg&isbn13=9780307272508&isbn=0307272508&title=The+Third+Rail 

¿Hay alguna manera de hacer que los parámetros no aparecen en la URL?

+0

¿Por qué lo necesitas? ¿De dónde viene este parámetro? ¿Es de la entrada del usuario o de dónde? Cuando lo miro, parece que estás haciendo algo de una manera extraña. Explique por qué lo hace, porque probablemente haya una mejor manera. – klew

+0

Amazon devuelve estos parámetros en un formato de salida XML. Tengo una barra de búsqueda que permite al usuario consultar la base de datos de Amazon (usando Amazon ECS). Después de cada consulta, mi sitio completará los primeros diez elementos del resultado en una tabla. Cada elemento tendrá un botón que le permite al usuario seleccionar ese artículo para vender. Necesito que estos parámetros se muestren en un formulario en otra Vista. Estos parámetros eventualmente se guardarán en mi base de datos. La razón por la que no me gustan los parámetros que aparecen es que el usuario puede manipular manualmente la URL. – user1994764

+0

no parece que ocultar los parámetros del usuario va a resolver su problema. El usuario malintencionado siempre podrá descubrir los parámetros y manipularlos. Al implementar su enfoque, hace que el código sea más complicado, pero en realidad no mejora la seguridad de ninguna manera. – paulus

Respuesta

2

Hay dos opciones que puedo ver y ambas implican JavaScript:

  • dejo el enlace a poblar campos de formulario ocultos para los parámetros y luego enviar el formulario mediante una petición HTTP POST
  • dejo el enlace presente una solicitud AJAX a la acción del controlador (usando un HTTP GET a menos que haga clic en el enlace cambia el estado del servidor, en cuyo caso se debe usar un POST)

Creo que iría con el segundo enfoque.

4

Un POST se puede utilizar para mover los parámetros de la URL a la solicitud, pero esta no es la "correcta" o la mejor práctica. Los estándares HTTP son tales que las solicitudes no GET están destinadas a ser utilizadas solo para solicitudes que cambian de estado en el servidor. Es por eso que recibe una advertencia cuando actualiza una página que se generó en respuesta a un POST.

No hay nada de malo en tener parámetros en la URL. No se debe enfocar tanto en lo que aparece en la barra de la URL, y mucho menos en lo que está detrás de la? Sin embargo, si tiene alguna necesidad (es decir, insistencia de un cliente) para eliminarlos, tiene varias opciones, dos de las cuales John menciona.

Supongo que su "nueva" acción es de estilo REST, ya que está generando un formulario que tendría que enviarse para cambiar de estado en el servidor. Por lo tanto, sus opciones podrían ser:

  1. Use POST, aunque no sea compatible con las normas. No recomendado.
  2. Utilice AJAX GET. Esto requiere javascript, y el manejo de ajax agrega requisitos tales como el uso de un marco JS y pruebas.
  3. Use GET (o POST), pero capture los parámetros y guárdelos, redirija al usuario a otra URL limpia que muestre esos valores almacenados. Puede almacenarlos en el hash de sesión o crear un registro de base de datos de ellos. De hecho, debería usar POST en este caso, ya que está cambiando efectivamente el estado en el servidor almacenando esos parámetros. En este caso, si el usuario actualiza la página a la que está dirigido, esos parámetros se conservarán. Esto elimina de manera efectiva la advertencia del navegador durante la actualización, algo que ciertamente puedo apreciar.
7

¿Quizás podría codificar los parámetros y decodificarlos en el controlador para disuadir a los usuarios que quieran modificar la url? Puede ser exagerado pero ...

>> author=ActiveSupport::Base64.encode64("author=jim") 
=> "YXV0aG9yPWppbQ==\n" 
>> ActiveSupport::Base64.decode64(author) 
=> "author=jim" 
0

¿Por qué no escribirlos en la sesión? Parece que puede haber menos de 4k en datos allí. Solo recuerda limpiarlo.

Cuestiones relacionadas