Ruby on rails Slug url——什么';routes.rb中需要什么?
快速提问 我在Posts控制器中创建了一个slug方法,以便@post.slug返回(ex)“这是post名称”Ruby on rails Slug url——什么';routes.rb中需要什么?,ruby-on-rails,ruby-on-rails-3,Ruby On Rails,Ruby On Rails 3,快速提问 我在Posts控制器中创建了一个slug方法,以便@post.slug返回(ex)“这是post名称” 但是,我不确定如何在routes.rb文件中使其工作(“posts/this is the post name”),而且我也没有找到一个完全符合答案的问题或指南。知道怎么做吗?如果已经设置了资源,则不需要在路由中添加任何内容。如果没有,那么您在路线中所需要的就是 resources :posts 然后,要使用slug作为参数,需要在post模型中定义一个to_param方法 # p
但是,我不确定如何在routes.rb文件中使其工作(“posts/this is the post name”),而且我也没有找到一个完全符合答案的问题或指南。知道怎么做吗?如果已经设置了资源,则不需要在路由中添加任何内容。如果没有,那么您在路线中所需要的就是
resources :posts
然后,要使用slug作为参数,需要在post模型中定义一个to_param
方法
# post.rb
def to_param
slug
end
url_调用此方法以将对象转换为url。比如说
>> @post.slug = 'this-is-the-post-name'
>> post_path(@post) = '/posts/this-is-the-post-name'
您还需要注意的一件事是获取记录。由于url不再包含帖子的ID,因此您必须按slug进行搜索。例如,在show action中
def show
# this will not work anymore
# @post = Post.find params[:id]
# you should change this to
@post = Post.find_by_slug params[:id]
end
扩展jvnill的答案,确保slug是posts表中的一列,并且应该是唯一的,否则您会遇到问题。尽管自己滚动始终是一种很好的学习体验,但使用能够处理slug的gem可能更实际。我通常会转向
FriendlyId
,因为它是积极开发的,有很多很好的选择,并且使slaging非常简单
实际上,您可以通过重写ARs find_one方法使
find
工作,该方法最终会从find中调用。你是对的。但是告诉OP改变查找记录的过程要比重写AR方法容易得多,因为AR方法超出了这个问题的范围。谢谢你的建议。由于有一个简单的宝石在那里,我想我要传递的自制版本,这一次(特别是,因为我不想在我的模型中制作一个slug列)。不过,谢谢!嗯,也许,事实上。这看起来还不错,而且我通常更喜欢轻量级的。感谢所有的选择!不,我完全同意。尽管如果要使用friendlyid:,仍然需要添加slug列)