2010-01-15 217 views
0

假设我有一个带有Post模型的Ruby on Rails博客应用程序。默认情况下,您可以通过http //.../ post/id阅读帖子。我添加了一个路线链接中的漂亮URL在链接

map.connect ':title', :controller => 'posts', :action => 'show' 

将接受HTTP标题//.../(标题是唯一的),控制器将做标题查询并显示该网页。但是,当我现在调用<%= link_to h(post.title)时,在视图中发布%>,Rails仍然给我链接post/id类型。

是否有可能让Rails在这种情况下为我自动创建漂亮的链接?

回答

1

如果你愿意接受:HTTP:/.../ 1234标题文本,你可以这样做:

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电话后这条线路会出现。

+0

但是,这仍然创建http:/.../ post/1234标题文本,即控制器名称仍然在那里:-( – Alex 2010-01-15 20:23:46

+0

糟糕,错过了,答案更新。 – cwninja 2010-01-19 17:20:26

0

您可以覆盖ActiveRecord's to_param method并使其返回标题。通过这样做,你不需要为自己制定路线。只要记住URL编码它。

什么可能是一个更好的解决方案是看看The Ruby Toolbox什么permalinks必须提供。我认为使用其中之一会比通过to_param自己修复它更好。

+0

的to_param完全不是那么回事,因为它仍然会把控制器名称进入画面。然而,我会看看永久链接插件。 – Alex 2010-01-15 20:25:00

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> 

然后在您的创建方法,保存之前,对生成永久链接

@post = Post.new(params[:post]) 
@post.permalink = @post.subject.parameterize 
if @post.save 
    #ect 
+0

是的,这就是我已经在做的。我希望Rails能够拥有像这样的内置功能,其中一个需要注意的是硬编码的根URL,它会在子目录下运行时破坏这个应用程序。ActionController :: Base.relative_url_root应该被添加到URL的前面这里安全的一面。 – Alex 2010-01-15 21:38:09

相关问题