使用 FriendlyID 在 Rails 中独立于标题编辑 slug
Posted
技术标签:
【中文标题】使用 FriendlyID 在 Rails 中独立于标题编辑 slug【英文标题】:Edit slugs independently of title in Rails using FriendlyID 【发布时间】:2018-03-11 17:21:33 【问题描述】:我正在创建一个 Blog Rails webapp。我决定使用 FriendlyID gem,我想在编辑视图上添加自定义 slug 的功能)。但是,slug 似乎无法自行修改。目前,slug 仅在标题运行时更新,我希望有一个可以独立更新且不一定与标题绑定的 slug
博客.rb
class Blog < ApplicationRecord
enum status: draft: 0, published: 1
extend FriendlyId
friendly_id :title, :use => [:slugged, :history]
def should_generate_new_friendly_id?
slug.blank? || title_changed?
end
end
blog_controller.rb
def set_blog
@blog = Blog.friendly.find(params[:id])
end
【问题讨论】:
【参考方案1】:看看friendly_id wiki page这个帖子
假设您希望您的 Blog
能够独立于标题(slug 的来源)编辑 slug,并且不默认为另一个字段:
class Blog < ActiveRecord::Base
attr_accessor :temporary_slug
extend FriendlyId
friendly_id :slug, :use => [:slugged]
def should_generate_new_friendly_id?
temporary_slug_changed?
end
# track changes in non persisted attribute
def temporary_slug=(value)
attribute_will_change!('temporary_slug') if temporary_slug != value
@temporary_slug = value
end
def temporary_slug_changed?
changed.include?('temporary_slug')
end
end
示例输出如下所示:
blog = Blog.create(title: "How Long is a Long Long Time")
blog.slug
# nil
post = Blog.update_attributes(title: "Some other title", temporary_slug: "My favorite blog")
blog.slug
# 'my-favorite-blog'
否则,如果您希望 slug 默认为标题的版本,您可以这样做:
class Blog < ActiveRecord::Base
extend FriendlyId
friendly_id :title, :use => [:slugged]
validates_presence_of :title
def should_generate_new_friendly_id?
if !slug?
name_changed?
else
false
end
end
end
blog = Blog.create(title: "How Long is a Long Long Time", slug: 'how-long')
blog.slug
# 'how-long'
blog = Blog.create(title: "How Long is a Long Long Time")
blog.slug
# 'how-long-is-a-long-long-time'
【讨论】:
嗨!谢谢您的帮助!但是,按照说明操作后,我使用temporary_slug 为我更新的博客条目获得以下输出:“我最喜欢的博客”更新:slug:“c4f2455c-08a1-47f9-bca8-722543b52971”似乎slug 被转换为某种类型的ID .有什么想法吗?以上是关于使用 FriendlyID 在 Rails 中独立于标题编辑 slug的主要内容,如果未能解决你的问题,请参考以下文章