快速提问。
我在我的帖子控制器中创建了一个 slug 方法,以便@post.slug 返回(例如)“this-is-the-post-name”。
但是,不确定在我的 routes.rb 文件中要做什么才能使其工作('posts/this-is-the-post-name'),而且我没有找到完全适合答案的问题或指南。知道怎么做吗?
快速提问。
我在我的帖子控制器中创建了一个 slug 方法,以便@post.slug 返回(例如)“this-is-the-post-name”。
但是,不确定在我的 routes.rb 文件中要做什么才能使其工作('posts/this-is-the-post-name'),而且我没有找到完全适合答案的问题或指南。知道怎么做吗?
如果您已经设置了资源,则无需在路线中添加任何内容。如果没有,您在路线中所需要的只是
resources :posts
然后,要使用 slug 作为参数,您需要to_param
在 post 模型中定义一个方法。
# post.rb
def to_param
slug
end
此方法由 url_for 调用以将对象转换为 url。例如
>> @post.slug = 'this-is-the-post-name'
>> post_path(@post) = '/posts/this-is-the-post-name'
您还需要注意的另一件事是获取记录。由于 url 不再包含帖子的 id,因此您必须按 slug 搜索。例如,在 show 动作中
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 是您的帖子表上的一列,并且应该是唯一的,否则您将遇到问题。
尽管自己动手总是一种很好的学习体验,但使用可以处理 slugging 的 gem 可能更实用。我通常会转向它,FriendlyId
因为它正在积极开发并且有很多很棒的选择,并且使 slugging 非常简单。