Вас смущает синтаксический сахар 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