9

RailsアプリケーションでFriendlyIdgem(バージョン4.0.8)を使用しました。RailsCastsのチュートリアルに従い、ドキュメントに基づいて、Model.find_each(&:save)古いレコードのスラッグを生成するためにRailsコンソールで実行する必要があります。ただし、これを行うと、古いレコードのすべてのスラッグ属性がnilのままであるため、実際には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?new_record?レコードがすでに存在するため、はfalseであるため、はfalseを返します。

メソッドを削除するshould_generate_new_friendly_id?か、これを試して再実行してください。

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

参照:HerokuのRails Friendly_Id、Herokuはスラッグを更新しません

于 2012-08-23T04:49:06.507 に答える
2

Rails 6アプリケーションで作業しているときに、これと同じ課題がありました。

これが私がそれを解決した方法です

デフォルトでは、 Friendly_idgemはRailsアプリケーションの既存のレコードのスラッグを生成しません。したがって、モデルの既存のレコードがある場合、それらのスラッグは生成されません。これらは、新しいレコードに対してのみ生成されます。

既存のレコードのスラッグを生成するには、次のようにします。モデル名がBlogで、スラッグに使用する列がtitleであるとすると、次のようになります。

  • 必ず最初にスラッグ列を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コンソールを起動し、以下のコマンドを実行して、既存のレコードのスラッグを生成します。

    rails console
    
    Blog.find_each(&:save)
    

    :テスト、ステージング、本番など、既存のレコードがあるすべての環境でこのコマンドを実行して、それらの環境でもレコードのスラッグを生成する必要があります。

これで、次のようなタイトルの新しいブログを作成すると、私の最初のブログで、URL http:// localhost:3000 / blogs/my-first-blogを使用してブログの表示ページにアクセスできるようになります。

それで全部です。

これがお役に立てば幸いです

于 2021-03-07T21:41:00.653 に答える