使用 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的主要内容,如果未能解决你的问题,请参考以下文章

使用 Rails 5,如何让 FriendlyId 附加 -"count+1" 来复制 slug 而不是 UUID?

Rails:FriendlyId gem 不工作

在模块中使用 FriendlyId

在 FriendlyID slug 中隐藏资源名称

将 FriendlyID slugs 翻译成对应的 ID

独立测试rails部分视图