¿Cuál es la forma correcta de definir una etiqueta de anclaje en los carriles?
-
21-09-2019 - |
Pregunta
Es obvio desde el documentación (y Google) cómo para generar un enlace con un segmento por ejemplo, podcast/5#comments
. Usted sólo tiene que pasar un valor para :anchor
a link_to
.
Mi preocupación es acerca de la tarea mucho más sencilla 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.
Solución
se está confundiendo por el azúcar sintáctica de Ruby (que Rails utiliza profusamente). Voy a explicar esto brevemente antes de responder a su pregunta.
Cuando una función 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
Ruby llenar los espacios en blanco y entender que lo que está tratando de lograr es la siguiente:
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 de forma incorrecta:
link_to('Comments', {:name => 'Comments'}, {}) # incorrect
Se pensará que parte name => 'Comments'
pertenece a las opciones, no html_options
!
Tienes que ayudar rubí por llenar los espacios en blanco usted mismo. Poner todo el paréntesis en su lugar y se comportará como se espera:
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
Con el fin de utilizar html_options, tiene que salir el primer conjunto de corchetes, sin embargo. Por ejemplo, tendrá que hacer esto para un enlace con el mensaje de confirmación y el 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 deben aprender esta técnica. En caso de duda, sólo tiene que añadir todos los paréntesis.
Otros consejos
Si usted quiere pasar por los carriles, sugiero content_tag
( docs ).
Ejemplo:
content_tag(:a, 'Comments', :name => 'comments')
<%= link_to('new button', action: 'login' , class: "text-center") %>
creado una etiqueta de anclaje para login.html i.g
<a href="login.html" class = "text-center"> new button </a>
y
<a href="admin/login.html" class = "text-center"> new button </a>
uso
<%= link_to('new button', controller: 'admin',
action: 'login' , class: "text-center") %>