9

我在 Rails 应用程序中使用了 FriendlyId gem(版本 4.0.8)。我已经按照RailsCasts上的教程进行操作,并且根据文档,我必须Model.find_each(&:save)在 rails 控制台上运行才能为旧记录生成 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
4

2 回答 2

11

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

另请参阅:Heroku 上的 Rails Friendly_Id,Heroku 不更新 slug

于 2012-08-23T04:49:06.507 回答
2

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

这是我解决它的方法

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

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

  • 确保首先在表中添加一个 slug 列Blog

    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 访问博客显示页面。

就这样。

我希望这有帮助

于 2021-03-07T21:41:00.653 回答