2012-02-21 14 views
12

Me gustaría pasar un parámetro a través de un método link_to en Rails. Sé que hay una manera de hacerlo a través de la URL, pero realmente no quiero hacer eso. ¿Hay alguna manera de pasar un parámetro a través de un enlace sin agregarlo al enlace en sí?Pase los parámetros en Link_to

Sé en PHP que puede publicar y luego recuperar ese valor mediante el uso de la variable de publicación. ¿Hay algo similar en Rails?

Respuesta

10

link_to firma se ve de la siguiente manera:

link_to(body, url_options = {}, html_options = {}) 

Así, POST se vería así (digamos que usted quiere para enviar datos de usuarios): los datos

link_to "Link text", some_path(:foo => "bar", :baz => "quux"), user: @user, :method => :post 

del usuario pueden ser recuperados en el controlador usando params[:user]

3

Pasar la información a través de una solicitud web se puede hacer mediante la URL: http://example.com/foo?bar=blah en una solicitud GET que es lo que hace link_to, o a través de una operación POST que generalmente requiere un formulario. La forma podría tener elementos ocultos, si lo que desea es un botón de envío:

<form method="POST" action="http://example.com/foo"> 
    <input type="hidden" name="bar" value="blah"> 
    <input type="submit"> 
</form> 

Hay varios carriles auxiliares para ayudar a construir la forma si es necesario.

Por último, si realmente quiere un enlace, puede usar el estilo CSS de ese botón, o puede usar javascript para observar un enlace y luego PUBLICAR la información. (El método que Simon Bagreev publicó hace esto con javascript)

+0

Gracias. No pude entender por qué la solución de Simon Bagreev funcionaría. Ahora, tengo que buscar una explicación en CSS o JavaScript. – Katarzyna

1

¿Qué tipo de parámetro? Si es una clave para una solicitud GET, la convención dictaría el uso de la url (por ejemplo, params [: id] o una variable de ruta de registro activa). Si desea PUBLICAR algo, debe usar un formulario. De lo contrario, podría escribir un método de ayuda para establecer una variable de sesión o algo así, pero piense en su arquitectura y lo que está tratando semánticamente, y estoy seguro de que alguien puede ayudarlo.

+0

En esencia, es una solicitud GET, por lo que probablemente no debería hacer lo que quiero hacer y simplemente seguir las convenciones. Actualmente, tengo mis rutas bastante anidadas, ya estoy usando alrededor de 6 segmentos en la URL. Estaba tratando de evitar usar la URL para poner otros pocos segmentos. – Kyle

5

Así es como puede pasar un parámetro por el método link_to para, por ejemplo, crear un nuevo objeto con el parámetro pasado. Esta estrategia le permitiría pasar variables entre las acciones en el controlador y crear objetos con atributos predefinidos:

decir en su muestran vista, tiene una variable llamada @foo que desea pasar a su nueva acción del controlador. En cuyo caso, en su programa de vista, puede tener

<%= link_to "Link Text", new_widget_path(:foo => @foo) %> 

que almacenar @foo en params [: foo], lo que permite utilizar params [: foo] en su controlador. La acción del controlador al que se dirige depende de * new_widget_path *. En este caso, será dirigido a la nueva acción en WidgetController.

Al hacer clic en Texto del enlace dirigirá rieles a la nueva acción de su WidgetController.Usted puede tener

def new 
    @widget = Widget.new(:foo => params[:foo]) 
end 

Luego, en su new.html.erb archivo vista, puede permitir al usuario crear un nuevo objeto Widget con esta predefinido foo atributo ya llenado a través de una oculta campo de formulario:

<%= form_for(@widget) do |f| %> 
    <%= f.label :other_attribute %><br /> 
    <%= f.text_field :other_attribute %> 
    <%= f.hidden_field :foo %> 
    <%= f.submit %> 
<% end %> 

que permite al usuario crear un nuevo widget con el foo atributo ya rellenado!

+1

Lo sorprendente de esta solución es que es tan detallada y está claramente explicada. Muchas gracias por publicar. Todavía útil un año después. – camdixon

+0

Este ejemplo aún no muestra cómo 'ocultar' params en url después de hacer clic en link_to, antes de llegar a formar en la página nueva. – Katarzyna

Cuestiones relacionadas