Rails url需要帖子/:id / the-name-of-post

时间:2011-04-02 22:09:34

标签: ruby-on-rails url routes vanity-url

我希望我的rails网址看起来像:

/posts/345/the-great-concept

当我在帖子模型中使用以下内容时,

def to_param
   "#{id}/#{name.parameterize.downcase}"
end

网址在浏览器中看起来很棒。并且功能正常。但是,一旦页面加载到浏览器URL中,它看起来像:

/posts/345%2Fthe-great-concept

并且要清楚,“名称”只是为了好看 - 帖子只能通过id检索。我也不想使用数据库slug方法。

我该如何更好地接近这个?

PS。不想要“/ posts / 345-the-great-concept”......

1 个答案:

答案 0 :(得分:4)

它逃脱了,因为它不是路径的一部分,而是一个参数,所以它需要被逃脱,否则你将会出错。

def to_param
  "#{id}-#{name.parameterize.downcase}"
end

编辑:好的,所以斜线确实很重要;以下是解决问题的方法:

为此创建自定义路线:

# in config/routes.rb
resources :posts
match '/posts/:id/:slug' => 'posts#show', :as => :slug

然后创建你的slug方法:

# in app/models/post.rb
def slug
  title.parameterize.downcase
end

然后将您的路线更改为show动作,以便链接到花哨的网址:

# in any link to show; redirect after create, etc..
link_to slug_path(@post, :slug => @post.slug)

我创建了一个应用来测试所有这些,如果有兴趣,你可以查看: https://github.com/unixmonkey/Pretty-Path