链接时Rails中的漂亮URL

时间:2010-01-15 18:56:16

标签: ruby-on-rails

假设我有一个带有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为我自动创建漂亮的链接?

4 个答案:

答案 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 Toolboxpermalinks提供的内容。我认为使用其中一个比通过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)

有一个宝石让你完美地完成这件事

https://github.com/rsl/stringex