【问题标题】:Edit slugs independently of title in Rails using FriendlyID使用 FriendlyID 在 Rails 中独立于标题编辑 slug
【发布时间】: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

【问题讨论】:

    标签: ruby-on-rails ruby slug friendly-id


    【解决方案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 .有什么想法吗?
    猜你喜欢
    • 2016-09-26
    • 1970-01-01
    • 2018-04-09
    • 2014-11-19
    • 1970-01-01
    • 2012-06-20
    • 1970-01-01
    • 2017-06-01
    • 1970-01-01
    相关资源
    最近更新 更多