hello_path
пытается сделать?» hello_path
знает, сколько параметров он должен получить. Это из подсчета названных параметров в config/routes
. Он будет принимать либо хеш, либо список аргументов. Если вы дадите ему хеш, ключи должны совпадать с именами параметров URL. Если вы дадите ему список аргументов, он просто сопоставит их по положению - первый аргумент с первым именованным параметром.
Затем он вызовет to_param
для каждого параметра по отдельности, прежде чем объединить их все вместе ( см. Здесь код, ветвь 4.0 ).
Если вы передадите объект, когда он ожидает 2 или более параметров, он даже не сможет вызвать to_param для объекта. Вот когда вы получаете ошибки без трассировки стека, которые говорят что-то вроде No route matches {:controller=>"posts", :action=>"show", :id=>#
Если у вас есть только один именованный параметр, вещи довольно просты. Если вам нужно искать ваши сообщения по имени, а не по id, вы можете просто переопределить to_param
class Post < ActiveRecord::Base
...
def to_param
name
end
end
Но если URL имеет более одного имени параметр в этом, то переопределение to_param
недостаточно. Допустим, вы попробовали это:
# app/models/post.rb
class Post < ActiveRecord::Base
...
def to_param
{name: name, title: title}
end
end
# app/views/posts/index.html.erb
<%= post_path(post) %>
В этом случае вы получите ошибку маршрутизации, потому что вы не передаете достаточное количество аргументов в post_path (см. Выше). Чтобы обойти это, я просто вызываю to_param
явно:
# app/views/posts/index.html.erb
<%= post_path(post.to_param) %>
Это немного менее ловко, чем большинство магии маршрутизации Rails, но работает отлично. Если вы позже измените способ поиска сообщений, все, что вам нужно сделать, это переопределить to_param. Не нужно беспокоиться обо всех местах, которые вы назвали post_path
Соответствующий код, на который стоит обратить внимание: actionpack / lib / action_dispatch / routing
What options are you passing to ctags? --extra=+q
may help...