Как указать, что именованный маршрут должен использовать столбцы модели с ее функциями _url и _path?

У меня есть модель сообщений с id и заголовками столбцов.

Мой маршрут (рельсы 2.3.8) настроен следующим образом:

map.post ':title/:id', :controller => 'posts', :action => 'show'

который работает правильно при распознавании URL-адресов и при генерации их явно, как в

post_url(:title => 'foo', :id => 123)

который хорошо выглядит как /foo/123. Я хотел бы иметь возможность звонить

p = Post.create!(:title => 'foo') # let's assume it gets ID 123
url_for(p)

и получить тот же путь. Но я получаю ошибку:

post_url failed to generate from {:action=>"show", :controller=>"posts",
    :title=>#<Post id: 123 title: "foo" created_at: ...

Как указать, что именованный маршрут должен использовать столбцы модели с ее функциями _url и _path?

1 ответ

Когда вы объявляете маршрут, способ его вызова требует определенного числа параметров, и они должны быть указаны в правильном порядке, иначе все может запутаться.

Вот несколько типичных маршрутов:

map.none '/', :controller => 'none', :action => 'index'
map.one '/:one_id', :controller => 'one', :action => 'show'
map.two '/:one_id/:two_id', :controller => 'two', :action => 'show'
map.three '/:one_id/:two_id/:three_id', :controller => 'three', :action => 'show'

Когда вы хотите вызвать их, вам нужно указать параметры, которые вы указали в маршруте, иначе он будет недействительным:

none_path
one_path(one)
two_path(one, two)
three_path(one, two, three)

Вы можете включить дополнительные параметры в конце. Обычно плохая идея смешивать и сопоставлять методы автоматической и ручной маршрутизации:

# Using named routes
one_path(one) # /one/1
one_path(one, :two_id => two) # /one/1?two_id=2
one_path(:one_id => one) # Awkward format for same

# Using automatic routing
url_for(:controller => 'one', :action => 'show', :one_id => one) # /one/1

Параметры пути в скобках, такие как (:format) являются необязательными, но их лучше избегать, кроме случаев, когда существуют безопасные значения по умолчанию.

Вы, вероятно, спотыкаетесь url_for метод путем включения двух параметров в вашем маршруте, а не просто :id,

Другие вопросы по тегам