私は以下を使用しています:
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
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
私はこの問題を抱えており、私が気づいたことを指摘したいと思います。
ドキュメントのようにするだけなら
_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)
を実行しても何も起こりません。タイトルは変わらないので、私は推測します。 (最初の方法はロシア語を処理します)
そのため、最初のモデルで作業するときはすべてうまくいきましたが、準備ができたコードを次のモデルにコピーしたときに、スラッグ化したいと思ったときに、いくつかの問題が発生しました。それが誰かを助けることを願っています。