Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Slug url——什么';routes.rb中需要什么?_Ruby On Rails_Ruby On Rails 3 - Fatal编程技术网

Ruby on rails Slug url——什么';routes.rb中需要什么?

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

快速提问

我在Posts控制器中创建了一个slug方法,以便@post.slug返回(ex)“这是post名称”


但是,我不确定如何在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列)