新手问题 [已解决] 关于博客 slug 的问题

匿名 · 2013年09月15日 · 最后由 schilanford 回复于 2013年09月16日 · 3794 次阅读

新学 Rails,正在实现一个博客。之前一直默认 post 的 id 作为其 url,现在欲实现自定义 url。

先在 post 表里增加 slug 字段,后在 post model 里增加以下代码:

def self.find(slug)
  find_by_slug(slug)
end

def to_param
  slug
end

现在新建的 post 能实现 CRUD,而之前没有 slug 的 post 不能 CRUD。

想到的思路是如果通过 slug 找不到 post 再通过 id 寻找。求大家指导,谢谢!

Update: 最终的方法是

def self.find(slug)
  slug.to_i == 0 ? find_by_slug(slug) : super
end

def to_param
  slug ? slug : id
end

再次谢谢大家的回复!

可以考虑使用重写 Post 的 to_param 方法

def to_param
  "#{id}-#{slug}"
end

这样显示的及满足了自定义 url 的需求,其余的逻辑代码基本也不需要变动。

Post.find(params[:id])

这样的方法对于有 slug 和没有 slug 的 Post 都有效。可参考:https://gist.github.com/agnellvj/1209733

匿名 #2 2013年09月15日

#1 楼 @reyesyang 谢谢。这种格式之前考虑过,而且目前博客也正在用,只是因为不太喜欢 url 里放 id,想改成纯 slug 格式的 url。

看 19wu 好像用到了 friendly_id 这个 gem

把原有 Post 的 Slug 字段重新生成一下不就好了么?

楼主想到的思路是如果通过 slug 找不到 post 再通过 id 寻找,但是又不太喜欢 url 里放 id,这不是悖论吗?

匿名 #6 2013年09月15日

#3 楼 @chunlea 因为是初学 rails,很多东西不懂,所以不想太依赖 gem,也就没考虑 friendly_id。

匿名 #7 2013年09月15日

#4 楼 @chaixl 因为之前没有 slug 的 post 增加 slug 字段后默认值为 nil,通过 slug 查找 post,根本没法进行查找、编辑等操作。除非直接在数据库里操作,更改 slug 字段。

匿名 #8 2013年09月15日

#5 楼 @libuchao 可能是我没有表述清楚问题。目前情况是新建一篇 post,自定义 url,最后可以通过 slug 找到该 post。问题是之前已经写好的没有 slug 的 post,增加 slug 字段后默认值为 nil,无法通过 slug 查找出来。所以我想如果通过 slug 找不出则通过 post_id 找出来。因为刚接触 rails,很多东西不知道,我不知道这样能不能实现,所以想请教一下。

if slug slug else id end

匿名 #10 2013年09月15日

#9 楼 @hooopo 谢谢,已经实现。代码可以写成

def to_param
  slug ? slug : id
end

另外还得加

def self.find(slug)
  slug.to_i == 0 ? find_by_slug(slug) : super
end

#8 楼 @schilanford

@post = Post.find_by_slug(params[:id]) || Post.find(params[:id])
匿名 #12 2013年09月15日

#11 楼 @Rei 在 posts_controller 里这样写也不错,只是我需要分别在 show、edit、update 和 destroy 里写四遍,倒不如直接在 Post 里重写 find 方法。不知我这样理解对不对?

@schilanford 抽取出来,放到 controller 的 before_filter 里面就好了,不需要写四遍。

#12 楼 @schilanford find 这个方法太核心了,我一般不会覆盖,会新建一个方法。

find_by_slug_or_id

匿名 #16 2013年09月16日

#13 楼 @chaixl #14 楼 @Rei 明白了,谢谢!

需要 登录 后方可回复, 如果你还没有账号请 注册新账号