2010-01-19 17 views
16

Es obvio desde el documentation (y google) cómo generar un enlace con un segmento, p. podcast/5#comments. Acaba de pasar un valor para :anchor a link_to.¿Cuál es la forma correcta de definir una etiqueta de anclaje en los rieles?

Mi preocupación es sobre la tarea mucho más simple de generar la etiqueta <a name="comments">Comments</a>, es decir, el destino del primer enlace.

He intentado lo siguiente, y aunque parecía funcionar, el margen de beneficio no era lo que esperaba:

link_to "Comments", :name => "comments" 
link_to "Comments", :anchor => "comments" 

Creo que me estoy perdiendo algo obvio. Gracias.

+0

Lo siento por no entender lo que claramente * * escribiste! ¡Mi error! Me alegra que hayas obtenido la respuesta que necesitabas. Quité el mío para no confundir a nadie :) –

Respuesta

52

Usted se está confundiendo por el azúcar sintáctica de Ruby (que Rails utiliza profusamente). Déjame explicarte esto brevemente antes de contestar tu pregunta.

Cuando una función de rubí toma un único parámetro que es un hash:

def foo(options) 
    #options is a hash with parameters inside 
end 

Puede 'olvidar' para poner el paréntesis/soportes, y lo llaman así:

foo :param => value, :param2 => value 

Rubí llenará los espacios en blanco y comprenderá que lo que está tratando de lograr es esto:

foo({:param => value, :param2 => value}) 

Ahora, a su pregunta: link_to toma dos hashes opcionales - uno se llama options y el otro html_options. Se puede imaginar que define así (esto es una aproximación, es mucho más compleja)

def link_to(name, options, html_options) 
... 
end 

Ahora, si se invoca esta manera:

link_to 'Comments', :name => 'Comments' 

Rubí obtendrá un poco confundido. Se tratará de "llenar los espacios en blanco" para usted, pero incorrectamente:

link_to('Comments', {:name => 'Comments'}, {}) # incorrect 

que va a pensar que name => 'Comments' parte pertenece a las opciones, no html_options!

Tienes que ayudar a ruby ​​llenando los espacios en blanco tú mismo. Poner todo el paréntesis en su lugar y se comportará como se esperaba:

link_to('Comments', {}, {:name => 'Comments'}) # correct 

En realidad se puede eliminar el último par de corchetes si quieres:

link_to("Comments", {}, :name => "comments") # also correct 

Para utilizar html_options, tiene que salir del primer conjunto de corchetes, sin embargo.Por ejemplo, tendrá que hacer esto para un enlace con el mensaje de confirmación y nombre:

link_to("Comments", {:confirm => 'Sure?'}, :name => "comments") 

Otros carriles ayudantes tienen una construcción similar (es decir form_for, collection_select) por lo que debe aprender esta técnica. En duda, solo agregue todos los paréntesis.

+0

Esto es exactamente lo que estaba buscando. ¡Gracias! –

+9

+1 no solo por dar la solución, ¡sino por explicarla! – Guillaume

14

Si desea pasar por los rieles, sugiero content_tag (docs).

Ejemplo:

content_tag(:a, 'Comments', :name => 'comments') 
+1

Gracias, creo que eso es lo que estaba buscando. Se me ocurre ahora que en haml, solo tomará '% a {: name =>" comments "} Comments' para hacer ese enlace. Supongo que solo esperaba no ser un enlace de codificación difícil en los rieles. –

+0

A veces es mejor simplemente lanzar una etiqueta, pero si estás erb'ing y no quieres salir de ruby, esto también es bueno :) – theIV

+0

Todavía me gusta esta respuesta, pero la de egarcia es lo que estaba buscando para. –

0
<%= link_to('new button', action: 'login' , class: "text-center") %> 

creado una etiqueta de ancla para i.g login.html

<a href="login.html" class = "text-center"> new button </a> 

y para

<a href="admin/login.html" class = "text-center"> new button </a> 

uso

<%= link_to('new button', controller: 'admin', 
    action: 'login' , class: "text-center") %> 
Cuestiones relacionadas