为了让我的rails 4 app有虚荣网址,我有一个多态Slug表(id,url)。然后在我的文章模型中,我有以下内容来创建slug:
class Article < ActiveRecord::Base
has_many :slugs, as: :sluggable, dependent: :destroy
after_save :create_slug
def create_slug
return if !url_changed? || url == slugs.last.try(:url)
#re-use old slugs
previous = slugs.where('lower(url) = ?', url.downcase)
previous.delete_all
slugs.create!(url: url)
end
end
@ article.url目前正在控制器中设置:
@article.url = @article.title.parameterize
除非存在冲突,否则此功能非常有效,这意味着正在使用已使用的标题创建文章。在这种情况下,导轨错误PG::UniqueViolation: ERROR: duplicate key value violates unique constraint
我认为我需要create_slug
首先检查值是否存在,如果不存在则创建slug但是,如果值确实存在,则附加-1或-2等... url的结尾,直到url是唯一的。这听起来不错吗?处理/编码此方案的最佳方法是什么?
由于
答案 0 :(得分:-1)
旧行为是在特殊module中实施的。但目前它还没有被释放。因此,如果要恢复旧行为,可以在Github上的Gemfile中切换friebdly_id
,并将sequentially_slugged
添加到模块列表中。
如果您不想移动任何宝石,那么最简单的方法是使用以下代码使网址更好....
def to_param
"#{id}-#{slug}"
end
您可以更新方法代码并根据需要制作网址。