Получение ctags + Vim для работы с обзором?

Чтобы ответить на ваш вопрос «что hello_path пытается сделать?»

hello_path знает, сколько параметров он должен получить. Это из подсчета названных параметров в config/routes. Он будет принимать либо хеш, либо список аргументов. Если вы дадите ему хеш, ключи должны совпадать с именами параметров URL. Если вы дадите ему список аргументов, он просто сопоставит их по положению - первый аргумент с первым именованным параметром.

Затем он вызовет to_param для каждого параметра по отдельности, прежде чем объединить их все вместе ( см. Здесь код, ветвь 4.0 ).

Если вы передадите объект, когда он ожидает 2 или более параметров, он даже не сможет вызвать to_param для объекта. Вот когда вы получаете ошибки без трассировки стека, которые говорят что-то вроде
No route matches {:controller=>"posts", :action=>"show", :id=>#}

Работа с 1 именованным параметром

Если у вас есть только один именованный параметр, вещи довольно просты. Если вам нужно искать ваши сообщения по имени, а не по 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

5
задан Niki Yoshiuchi 5 June 2009 в 19:18
поделиться