2016-06-25 18 views
1

Ich versuche, eine Friendly_id Slug zu einem vorhandenen Rails-Modell, Spree :: Variant hinzufügen. Variante gehört zu Produkt, das bereits seine eigenen Slugs hat, die gut funktionieren (Spree und diese Modelle stammen von einem Edelstein der dritten Partei).friendly_id Slug nicht generieren, aber Methoden aufgerufen

Wenn ich versuche, eine Variante zu speichern, erwarte ich, dass ein Slug generiert und im Feld slug in der Datenbank gespeichert wird, aber das Feld bleibt NULL.

Hier ist mein Modellcode:

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 

ähnliche Fragen beantwortet werden mit sicher should_generate_new_friendly_id? machen richtig definiert ist, die es hier zu sein scheint. Ich habe überprüft, dass es aufgerufen wird, und True zurückgegeben, wenn ich einen Datensatz aktualisiere, aber der Datensatz immer noch nicht mit einem Slug endet.

Ich habe auch überprüft, dass option_value_list aufgerufen wird, und gibt die gewünschten Informationen aus. Ein Beispiel Rückgabewert von meiner App ist "Titanium".

Warum ist meine Schnecke nicht erstellt? Wo kann ich das Problem weiter einschränken?

Antwort

2

Ich kann nicht wirklich sagen, dass ich die Lösung kenne, aber um das Problem einzugrenzen, müssen Sie die Spree::Variant source code überprüfen, die den Slug an die product Tabelle delegiert.

In der Produkttabelle ist slug eine has_many-Beziehung, die von use: :history bekannt ist. (Nicht im Zusammenhang mit dem Problem)

Das Problem ist mit den Spree::Core::DelegateBelongsTo#(delegator_for_setter|| delegator_for) Methoden, die früh zurückgeben, wenn der Spaltenname in der Tabelle vorhanden ist, anstatt die Datensätze entsprechend zu lesen oder zu aktualisieren.

Ein Weg, um diese zu arbeiten (wie ich weiß nicht, ob Spree für den Umgang mit diesen einen besseren Ansatz bietet) sind Ihre Slug Methoden als solche neu zu definieren:

def slug 
    read_attribute(:slug) 
end 

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

Hoffe, dass ich helfen konnte.