26

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

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
4

3 に答える 3

61

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

should_generate_new_friendly_id?

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

def should_generate_new_friendly_id?
  name_changed?
end

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

編集

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

編集2

この問題で参照されているように、Rails <5 & FriendlyId > 5 で保存を機能させるには、slug セッターをオーバーライドする必要があります。

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

  def slug=(value)
    if value.present?
      write_attribute(:slug, value)
    end
  end
于 2013-07-20T18:20:53.083 に答える
6

私はこの問題を抱えており、気づいたことを指摘したいだけです。

ドキュメントのようにのみ行う場合

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)上記のコードでは、タイトルが変更されないため、実行しても何もしません。(最初のメソッドはロシア語を扱います)

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

于 2016-03-26T14:30:06.130 に答える