0

をbefore_save:Railsの5.0.1 - Friendly_id宝石 - アクティブな懸念モジュールbefore_createを含めるか、私は、このモジュール作成した

アプリ/モデル/懸念/ sluggable.rb

module Sluggable 
    extend ActiveSupport::Concern 

    included do 
    before_create :set_slug 
    end 


    def set_slug 
    if self.slug.nil? 
     puts 'adding slug' 
     self.slug = SecureRandom.urlsafe_base64(5) 
    end 
    end 

end 

を、私はそれを含めますモデル、そのような:

アプリ/モデル/ plan.rb

class Plan < ApplicationRecord 
    extend FriendlyId 
    friendly_id :id, :use => :slugged 
    include Sluggable 
end 

しかしbefore_createはありません火事ではない。 slugカラムはnot_nullカラムなので、データベースエラーが発生します。

ERROR:モデルに直接set_slugコードを配置する場合は、列「スラッグ」にNULL値は非NULL制約に

に違反し、それが動作します。では、Rails 5の問題についてここでは何が分かりませんか?その何かがFriendlyId使用に関連している場合、私は疑問に思う(私は最初の場所でナメクジを追加した理由です!)

+0

set_slugはクラスメソッドであってはなりません。通常の方法として、プラグイン可能なモジュールの中に書いてください。 –

+0

それは私が最初に試したものです。同じ問題 - 私は最初にそれを持っていた方法(つまり、クラスメソッドとしてではなく)にコードを戻すための質問を更新しました – rmcsharry

+0

'before_save'に変更しても動作しますか? –

答えて

1

This

は私がこの問題を解決する助けました。 Friendly_Idは、それがnilの場合、before_validationコールバックにスラッグを設定します。

私のモジュールはそれより先に 'ジャンプ'する必要があります。ですから、Friendly_idと競合しないモジュールを作るための解決策は以下の通りです。

Notice私のフックのメソッド名を変更する必要があります(set_slugはFriendly_Idによって使用されるメソッドなので)、プリペンド:trueを使用する必要があります。 Friendly_Idがそのチェックを試して設定しようとする前に、これにより私のコードがスラッグをセットします。

module Sluggable 
    extend ActiveSupport::Concern 

    included do 
    before_validation :set_a_slug, prepend: true 
    end 


    def set_a_slug 
    if self.slug.nil? 
     self.slug = SecureRandom.urlsafe_base64(5) 
    end 
    end 

end 
関連する問題