Как правильно определить тег привязки в рельсах?

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

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

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

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

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


person Joe Flynn    schedule 19.01.2010    source источник
comment
Извините, что не понял, что вы четко написали! Виноват! Рад, что вы получили нужный ответ. Я удалил свой, чтобы никого не смущать :)   -  person Doug Neiner    schedule 19.01.2010


Ответы (3)


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

person kikito    schedule 19.01.2010
comment
Это именно то, что я искал. Спасибо! - person Joe Flynn; 20.01.2010

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

Пример:

content_tag(:a, 'Comments', :name => 'comments')
person theIV    schedule 19.01.2010
comment
Спасибо, я думаю, это то, что я искал. Теперь мне приходит в голову, что в haml для создания этой ссылки достаточно %a{:name => "comments"} Comments. Думаю, я просто ожидал, что в рельсах не будет жестких ссылок на код. - person Joe Flynn; 19.01.2010
comment
Иногда лучше просто вставить тег, но если вы нервничаете и не хотите вырваться из рубина, это тоже неплохо :) - person theIV; 20.01.2010
comment
Мне все еще нравится этот ответ, но я искал Эгарсию. - person Joe Flynn; 20.01.2010

<%= 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") %>
person Muhammad Aqeel    schedule 02.12.2016