web-dev-qa-db-ja.com

Rails 4フレンドリIDスラッグが更新されない

私は以下を使用しています:

gem 'friendly_id', github: 'FriendlyId/friendly_id', branch: 'master'

Rails 4のWebサイトに記事セクションを作成しています。既存の記事の名前を変更しても、スラッグが更新されないという問題があります。

これは私がこれまでに持っているものです:

extend FriendlyId
friendly_id :name, use: :slugged

add_column :articles, :slug, :string
add_index :articles, :slug, unique: true
23
Brian

FriendlyId 4(Rails 3互換)にはメソッドがありました

should_generate_new_friendly_id?

モデルで定義して、スラグがいつ再生成されるかを制御できます。試してみてください

def should_generate_new_friendly_id?
  name_changed?
end

名前が変更されたときにスラッグを再生成します。

編集

FriendlyIdバージョン5(Rails 4互換)は、保存時にスラッグを再生成しなくなりました。この機能を復元するには、保存する前にスラッグ列をnilに設定するか、上記のソリューションを使用します。

編集2

この issue で参照されているように、セーブがRails <5&FriendlyId> 5で機能するためには、スラッグセッターをオーバーライドする必要があります。

これをモデルファイルに追加します

  def slug=(value)
    if value.present?
      write_attribute(:slug, value)
    end
  end
52
Mike Szyndel

私はこの問題を抱えており、私が気づいたことを指摘したいと思います。

ドキュメントのようにするだけなら

_class Post < ActiveRecord::Base
 extend FriendlyId
 friendly_id :title, use: :slugged
end
_

次に、Post.find_each(&:save)を実行します-スラッグは更新されます...

しかし私の場合、私はこれらも私のモデルに持っています

_class Post < ActiveRecord::Base
 extend FriendlyId
 friendly_id :title, use: :slugged

 def normalize_friendly_id(text)
   text.to_slug.normalize(transliterations: :russian).to_s
 end

 def should_generate_new_friendly_id?
   title_changed?
 end
end
_

上記のコードでは、Post.find_each(&:save)を実行しても何も起こりません。タイトルは変わらないので、私は推測します。 (最初の方法はロシア語を処理します)

そのため、最初のモデルで作業するときはすべてうまくいきましたが、準備ができたコードを次のモデルにコピーしたときに、スラッグ化したいと思ったときに、いくつかの問題が発生しました。それが誰かを助けることを願っています。

3
AndreiMotinga