假设我有一个带有Post模型的Ruby on Rails博客应用程序。默认情况下,您可以按http://.../post/id
阅读帖子。我添加了一条路线
map.connect ':title', :controller => 'posts', :action => 'show'
将接受http://.../title
(标题是唯一的),控制器将对标题进行查询并显示页面。但是当我现在调用<%= link_to h(post.title)时,发布%>在一个视图中,Rails仍然给我post / id类型的链接。
在这种情况下,是否可以让Rails为我自动创建漂亮的链接?
答案 0 :(得分:1)
如果您愿意接受:http:/.../ 1234-title-text,您可以这样做:
def to_param
[id, title.parameterize].join("-")
end
AR::Base.find
忽略id之后的位,所以它“正常”。
要使/标题消失,请尝试命名您的路线:
map.post ':id', :controller => 'posts', :action => 'show', :conditions => {:id => /[0-9]+-.*/ }
确保在map.resources :posts
任何{{1}}电话后显示此路线。
答案 1 :(得分:0)
您可以覆盖ActiveRecord's to_param method并使其返回标题。通过这样做,您不需要为它创建自己的路线。请记住对其进行URL编码。
可能更好的解决方案是查看The Ruby Toolbox时permalinks提供的内容。我认为使用其中一个比通过to_param自己修复它更好。
答案 2 :(得分:0)
我会使用固定链接数据库列,路径,我通常会跳过使用link_to来支持更快的html锚标记。
设置路线如:
map.connect '/post/:permalink', :controller => 'post', :action => 'show'
然后在posts_controller的节目中显示:
link = params[:permalink]
@post = Post.find_by_permalink(link)
您的链接将是
<a href="/post/<%= post.permalink %>">Link</a>
然后在你的create方法中,在保存之前,用于生成永久链接
@post = Post.new(params[:post])
@post.permalink = @post.subject.parameterize
if @post.save
#ect
答案 3 :(得分:0)
有一个宝石让你完美地完成这件事