Как правильно определить тег привязки в рельсах? - PullRequest
17 голосов
/ 19 января 2010

Из документации (и Google) очевидно, как создать ссылку с сегментом, например. podcast/5#comments. Вы просто передаете значение для :anchor в link_to.

Меня беспокоит гораздо более простая задача создания тега <a name="comments">Comments</a>, то есть место назначения первой ссылки.

Я попробовал следующее, и, хотя они, казалось, работали, разметка оказалась не такой, как я ожидал:

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

Я думаю, что упускаю что-то очевидное. Спасибо.

Ответы [ 3 ]

54 голосов
/ 19 января 2010

Вы сбиты с толку синтаксическим сахаром Ruby (который Rails использует обильно).Позвольте мне кратко объяснить это, прежде чем ответить на ваш вопрос.

Когда функция ruby ​​принимает один параметр, который является хэшем:

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

Вы можете «забыть» поставить скобки / скобки,и назовите это так:

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

Руби заполнит пробелы и поймет, что вы пытаетесь сделать следующее:

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

Теперь к вашему вопросу: link_to принимает два необязательных хэша - один называется options, а другой html_options.Вы можете вообразить, что это определено так (это приближение, оно гораздо сложнее)

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

Теперь, если вы вызовете это так:

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

Ruby получитнемного смущен.Он попытается «заполнить пробелы» для вас, но неверно:

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

Он будет думать, что часть name => 'Comments' относится к параметрам, а не к html_options!

YouНужно помочь Рубину, заполнив пробелы самостоятельно.Поместите все скобки на место, и они будут вести себя, как и ожидалось:

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

Вы можете удалить последний набор скобок, если хотите:

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

Чтобы использовать html_options,Вы должны оставить первый набор скобок, хотя.Например, вам нужно сделать это для ссылки с сообщением подтверждения и именем:

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

Другие помощники рельсов имеют аналогичную конструкцию (то есть form_for, collection_select), поэтому вы должны изучить эту технику,Если сомневаетесь, просто добавьте все скобки.

14 голосов
/ 19 января 2010

Если вы хотите пройти через рельсы, я предлагаю content_tag ( документы ).

Пример:

content_tag(:a, 'Comments', :name => 'comments')
0 голосов
/ 02 декабря 2016
<%= link_to('new button', action: 'login' , class: "text-center") %>

создал тег привязки для login.html i.g

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

и для

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

использование

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