Rails路由 - 资源的自定义路由

时间:2010-02-15 20:49:54

标签: ruby-on-rails ruby resources routes

我正在构建一个Rails应用程序,我想坚持所有那些花哨的东西,如REST和资源,但我想稍微自定义我的路线。我希望我的GET路线更加冗长 - 我正在创建的应用程序是一个简单的博客,因此我更喜欢GET /posts/1而不是GET /posts/1-my-first-post

任何想法如何做到这一点?没有在网上找到任何东西。

5 个答案:

答案 0 :(得分:16)

路线:

map.resources :posts

型号:

class Post < ActiveRecord::Base
  def to_param
    "#{id.to_s}-#{slug}"
  end
end

应该做的伎俩。

顺便说一下:http://railscasts.com/episodes/63-model-name-in-url

答案 1 :(得分:4)

在模型中定义一个to_param方法,所有网址助手都会使用该方法返回的内容,例如:

class Post < ActiveRecord::Base
  der to_param
    slug
  end
end

您还需要调整控制器。替换:

Post.find(params[:id])

使用:

Post.find_by_slug(params[:id])

另请注意,当使用find_by_ *方法找不到记录时,find方法会引发ActiveRecord :: RecordNotFound异常,不会引发异常,因此您需要手动检查。

答案 2 :(得分:2)

你可以找到有用的friendly_id插件,因为如果你重命名你的slug(因此seo友好)它也会处理重定向,处理名称冲突并与find方法无缝集成,所以你不需要触摸你的控制器方法(重定向东西除外)。

答案 3 :(得分:0)

...替代地

将此类方法添加到application_helper.rb

def permalink(post)
  "#{post_path(post)}-#{post.slug}"
end

然后在您的观看中使用以下内容(使用permalink(@post)代替post_path

<%= link_to @post.title, permalink(@post) %>

答案 4 :(得分:0)

...替代地

将此类方法添加到post.rb

def path
  "/posts/#{id}-#{slug}"
end

然后在您的观看中使用以下内容: