如何指定命名路由应使用模型的列_ur和_path函数?

时间:2010-10-07 13:23:24

标签: ruby-on-rails named-routing

我有一个带有id和title列的帖子模型。

我的路由(rails 2.3.8)设置如下:

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

在识别URL和明确生成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: ...

如何指定命名路由应使用模型的列_ur和_path函数?

1 个答案:

答案 0 :(得分:0)

当您声明路线时,您调用它的方式需要一定数量的参数,并且必须以正确的顺序指定它们,否则事情可能会混淆。

以下是一些典型的路线:

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方法。