【问题标题】:Rails: Friendly_id does not generate slugs for old recordsRails:Friendly_id 不会为旧记录生成 slug
【发布时间】:2012-08-15 02:54:42
【问题描述】:

我在 Rails 应用程序中使用了 FriendlyId gem(版本 4.0.8)。我已经按照 RailsCasts 上的教程进行操作,并且根据文档,我必须在 rails 控制台上运行 Model.find_each(&:save) 才能为旧记录生成 slug。但是,当我这样做时,我所有的旧记录的 slug 属性仍然为零,所以它并没有真正改变 url。

我做错了吗?顺便说一句,这只发生在生产中。它在开发中运行良好。

更新:

我的模型如下所示:

class Member < ActiveRecord::Base
  extend FriendlyId
  friendly_id :name, use: :slugged

  belongs_to :gym

  attr_accessible :category, :name, :description
  validates :category, :name, :description, :presence => true

  has_attached_file :avatar, :styles => { :medium => "300x300>", :thumb => "100x100>" }

  def self.search(search)
    if search.present?
      where("name LIKE ?", "%#{search}%")
    else
      find(:all)
    end
  end

  def should_generate_new_friendly_id?
    new_record?
  end
end

【问题讨论】:

  • 你的model是什么样的?
  • 用型号代码更新了问题,谢谢。
  • 注释掉should_generate_new_friendly_id?块有用吗?
  • 在过去的答案中失去帮助stackoverflow.com/questions/10957505/…
  • @Kyle C 这正是我所经历的。虽然我决定手动更新旧记录的 slug,因为它们并不多。谢谢!

标签: ruby-on-rails ruby-on-rails-3 friendly-url friendly-id


【解决方案1】:

should_generate_new_friendly_id? 返回 false,因为 new_record? 为 false,因为您的记录已经存在。

删除should_generate_new_friendly_id? 方法,或者试试这个并重新运行:

def should_generate_new_friendly_id?
  new_record? || slug.blank?
end

另请参阅:Rails Friendly_Id on Heroku, Heroku not updating slugs

【讨论】:

    【解决方案2】:

    在开发 Rails 6 应用程序时,我遇到了同样的挑战。

    我是这样解决的

    默认情况下Friendly_id gem 不会为 Rails 应用程序中的现有记录生成 slug。因此,如果您有模型的现有记录,则不会为它们生成 slug。它们只会为较新的记录生成。

    要为现有记录生成 slug,请执行以下操作。假设我们的模型名称是 Blog 并且我们要用于 slug 的列是 title,我们将执行以下操作:

    • 请务必先向 Blog 表添加一个 slug 列:

      rails g migration AddSlugToBlogs slug:uniq
      
    • 接下来,生成友好的配置文件和新的迁移(如果您还没有这样做的话):

      rails generate friendly_id
      
    • 接下来,运行您的数据库迁移:

      rails db:migrate
      
    • 接下来,编辑app/models/blog.rb 文件如下:

      class Blog < ApplicationRecord
        extend FriendlyId
        friendly_id :title, use: :slugged
      end
      
    • 接下来,编辑 app/controllers/blogs_controller.rb 文件并将 Blog.find 替换为 Blog.friendly.find

      class BlogController < ApplicationController
        def show
          @blog = Blog.friendly.find(params[:id])
        end
      end
      

      class BlogsController < ApplicationController
        before_action :set_blog, only: %i[ show edit update destroy ]
      
        def show
        end
      
        private
        # Use callbacks to share common setup or constraints between actions.
        def set_blog
          @blog = Blog.friendly.find(params[:id])
        end
      end
      
    • 最后,启动 Rails 控制台并运行以下命令为现有记录生成 slug:

      rails console
      
      Blog.find_each(&:save)
      

      注意:您必须在拥有现有记录的所有环境(例如测试、暂存和生产)中运行此命令,以便为这些环境中的记录生成 slug。

    现在,当您创建一个如下所示的新博客并带有标题 - 我的第一个博客时, 您将能够使用 URL http://localhost:3000/blogs/my-first-blog 访问博客显示页面。

    就是这样。

    我希望这会有所帮助

    【讨论】:

      猜你喜欢
      • 2012-09-30
      • 1970-01-01
      • 2011-12-10
      • 2020-06-19
      • 2015-07-30
      • 1970-01-01
      • 2018-05-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多