我在Rails3项目中有以下路线:
match "/blog/:permalink" => "posts#show", :as => :post
当我通过这样的视图链接到我的帖子时:
<%= link_to @post.title, post_path(@post) %>
post的id被传递到post_path助手中(即使我的路由指定了permalink也被传递。
如何强制post_path发送permalink而不是post的id?我可以显式调用post_path(@post.permalink)
,但这似乎很糟糕。
我在路上错过什么了吗?
谢谢!
在模型上定义一个to_param
方法,该方法返回要使用的字符串。
class Post < ActiveRecord::Base
def to_param
permalink
end
end
请参阅此页面,此Railscast,(当然还有谷歌)了解更多信息。
[编辑]
我认为Polymorphic URL帮助程序不够聪明,无法处理你想在这里做的事情。我认为你有两种选择。
1.使用一条特殊的命名路线,并输入与您的问题和Jits的答案类似的参数
match "/blog/:permalink" => "posts#show", :as => :post
并链接到它
<%= link_to @post.title, post_path(:permalink => @post.permalink) %>
2.创建一个新的帮助程序,为您生成URL
match "/blog/:permalink" => "posts#show", :as => :post_permalink
和一个辅助
def permalink_to(post)
post_permalink_path(post.permalink)
end
在你看来
<%= link_to @post.title, permalink_to(@post) %>
试试这样的东西:
<%= link_to @post.title, post_path(:permalink => @post.permalink) %>
Rails应该根据您的路由自动构建URL(即相应地替换:permalink
)。