2016-06-25 17 views
1

私は、既存のRailsモデル、Spree :: Variantにfriendly_idスラッグを追加しようとしています。すでに所有しているスラグのあるバリアントbelongs_to Product(Spreeとこれらのモデルはサードパーティーの宝石のものです)。friendly_idスラグは生成されませんが、呼び出されるメソッド

バリアントを保存しようとすると、スラッグが生成され、データベースのslugフィールドに保存されると予想されますが、フィールドはNULLのままです。

Spree::Variant.class_eval do 
    extend FriendlyId 
    friendly_id :slug_candidates, :use => :slugged 
    validates :slug, length: { minimum: 3 }, allow_blank: true, uniqueness: true 

    self.whitelisted_ransackable_attributes = %w[weight sku slug] 

    def parent_slug 
    self.product.slug 
    end 

    def option_value_list 
    if !self.option_values.nil? && self.option_values.length > 0 
     opts = self.option_values.collect{ |v| 
     v.presentation }.join('-') 
     return opts 
    else 
     return '' 
    end 
    end 

    def slug_candidates 
    [ 
     [:parent_slug, :option_value_list], 
     [:parent_slug, :option_value_list, :sku] 
    ] 
    end 

    def should_generate_new_friendly_id? 
    puts "Is new #{new_record?}, is blank #{slug.blank?}" #Is new false, is blank true when updating test record 
    new_record? || slug.blank? 
    end 

end 

同様の質問が正しく定義されていることを確認should_generate_new_friendly_id?を作って答えている、ここに表示されます。

は、ここに私のモデルコードです。私はそれが呼び出され、レコードを更新するときにTrueを返すことを確認しましたが、まだレコードはスラッグで終わることはありません。

option_value_listが呼び出されたことを確認して、必要な情報を出力しました。私のアプリからの戻り値の例は "Titanium"です。

なぜ私のスラッグは作成されませんか?どこで問題をさらに絞り込むことができますか?

答えて

2

解決策はわかりませんが、問題を絞り込むには、スラッグをproductテーブルに委譲するSpree::Variant source codeを確認する必要があります。

slugは、use: :historyで知られているhas_many関係です。

問題はSpree::Core::DelegateBelongsTo#(delegator_for_setter|| delegator_for)メソッドにあります。これは、レコードを適切に読み取ったり更新したりするのではなく、テーブルに列名がある場合に早期に返されます。

(スプリーは、これらを処理するためのより良い方法を提供する場合、私は知らないとして)これらを回避するための方法は、次のようなあなたのスラグの方法を再定義している:私は助けることができた

def slug 
    read_attribute(:slug) 
end 

def slug=(new_slug) 
    write_attribute(:slug, new_slug) 
end 

希望。

関連する問題