0

我目前正在学习 ruby​​ on rails 3.0

我创建了一个帖子表,其中有一列名为friendly

而不是使用 /post/:id 我想使用 /post/:friendly

这意味着 URL 看起来像 /post/post-title 而不是 /post/1

我使用此代码正确构建了控制器。

def show
  @post = Post.find(params[:friendly])

  respond_to do |format|
    format.html
    format.json { render :json => @post }
  end
end

但我不确定如何更改 routes.rb 以实现此更改。

现在它只是说

resources :post

在此先感谢您的帮助。

4

2 回答 2

3

您可以在模型http://apidock.com/rails/ActiveRecord/Base/to_param上使用 to_param 方法

如果您将对象 ID 保留在友好名称中,例如 1-some-name, 2-some-other-name,您将无需执行任何其他操作。Rails 将从字符串中删除 id 并使用它来查找您的对象。如果不这样做,则必须更改控制器以使用 find_by_friendly(params[:id]) 而不是 find(params[:id])

另一种选择是使用像https://github.com/norman/friendly_id这样的 gem来完成此操作。

于 2012-09-18T00:03:51.773 回答
0

如果想在find上改变id变量的格式,可以改变路由如下

resources :post, :except => find do
  # Change the find to accept an id that's alphanumeric, but you can change 
  # this regex to whatever you need.
  get 'find', :on => :member, :constraints => { :id => /[a-zA-Z]*/ }
end

然后,要在帖子#find 中获取帖子,您需要执行

Post.find_by_friendly(Params[:id])

一个问题是这会破坏辅助路径 - 例如post_path(@post)需要成为post_path(:id => @post.friendly)

http://guides.rubyonrails.org/routing.html#http-verb-constraints

于 2012-09-18T00:40:09.780 回答