Вы сбиты с толку синтаксическим сахаром 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
), поэтому вы должны изучить эту технику,Если сомневаетесь, просто добавьте все скобки.