2

快速提问。

我在我的帖子控制器中创建了一个 slug 方法,以便@post.slug 返回(例如)“this-is-the-post-name”。

但是,不确定在我的 routes.rb 文件中要做什么才能使其工作('posts/this-is-the-post-name'),而且我没有找到完全适合答案的问题或指南。知道怎么做吗?

4

3 回答 3

6

如果您已经设置了资源,则无需在路线中添加任何内容。如果没有,您在路线中所需要的只是

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
于 2013-02-22T07:42:51.407 回答
5

扩展 jvnill 的答案,确保 slug 是您的帖子表上的一列,并且应该是唯一的,否则您将遇到问题。

于 2013-02-22T07:44:31.527 回答
-1

尽管自己动手总是一种很好的学习体验,但使用可以处理 slugging 的 gem 可能更实用。我通常会转向它,FriendlyId因为它正在积极开发并且有很多很棒的选择,并且使 slugging 非常简单。

友好ID

于 2013-02-22T07:51:47.177 回答