Ответ 1
Вас путают синтаксический сахар 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'
Ruby немного запутался. Он попытается "заполнить пробелы" для вас, но неправильно:
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")
Другие помощники рельсов имеют аналогичную конструкцию (т.е. form_for
, collection_select
), поэтому вы должны изучить эту технику. В сомнении просто добавьте все скобки.