2010-07-24 7 views
10

In un'applicazione Ruby on Rails sto tentando di utilizzare le informazioni dai campi non associati al modello in convalida.Rails: utilizzo di campi modulo non associati a un modello in convalide

Qui fa parte del modello come esempio (l'intero modello ha ottenuto un po grande):

class Scorecard < ActiveRecord::Base 
    belongs_to :course 
    belongs_to :user 

    validate :attributes_consistency 

    def attributes_consistency 
    # Executed for all scorecards. Checks if the user completed the hole attributes correctly 
    if (params[:no_fairways] and any_fairways? and !only_nine?) or (params[:no_fairways] and !any_h1_to_h9_score_blank and any_h1_to_h9_fairway? and only_nine?) or (params[:no_fairways] and !any_h10_to_h18_score_blank and any_h10_to_h18_fairway? and only_nine?) 
     errors.add_to_base("You inidicated that you missed all the fairways, but you also marked one or more fairways in the scorecard. Either uncheck the fairways mistakenly marked or uncheck the 'No fairways' checkbox.") 
    end 
    if (params[:no_girs] and any_girs? and !only_nine?) or (params[:no_girs] and !any_h1_to_h9_score_blank and any_h1_to_h9_gir? and only_nine?) or (params[:no_girs] and !any_h10_to_h18_score_blank and any_h10_to_h18_gir? and only_nine?) 
     errors.add_to_base("You inidicated that you missed all the greens, but you also marked one or more greens in the scorecard. Either uncheck the marked greens on the scorecard or uncheck the 'No GIRs' checkbox.") 
    end 
    end # attributes_consistency 


    def any_h1_to_h9_score_blank? 
    h1_score.blank? or h2_score.blank? or h3_score.blank? or h4_score.blank? or h5_score.blank? or h6_score.blank? or h7_score.blank? or h8_score.blank? or h9_score.blank? 
    end 
    def any_h10_to_h18_score_blank? 
    h10_score.blank? or h11_score.blank? or h12_score.blank? or h13_score.blank? or h14_score.blank? or h15_score.blank? or h16_score.blank? or h17_score.blank? or h18_score.blank? 
    end 

    def any_h1_to_h9_fairway? 
    h1_fairway? or h2_fairway? or h3_fairway? or h4_fairway? or h5_fairway? or h6_fairway? or h7_fairway? or h8_fairway? or h9_fairway? 
    end 
    def any_h10_to_h18_fairway? 
    h10_fairway? or h11_fairway? or h12_fairway? or h13_fairway? or h14_fairway? or h15_fairway? or h16_fairway? or h17_fairway? or h18_fairway? 
    end 

    def any_h1_to_h9_gir? 
    h1_gir? or h2_gir? or h3_gir? or h4_gir? or h5_gir? or h6_gir? or h7_gir? or h8_gir? or h9_gir? 
    end 
    def any_h10_to_h18_gir? 
    h10_gir? or h11_gir? or h12_gir? or h13_gir? or h14_gir? or h15_gir? or h16_gir? or h17_gir? or h18_gir? 
    end 

Così come posso accedere params dal modello?

risposta

15

Non lasciare che i parametri si avvicinino di soppiatto al modello. Non ha senso avere un controller in quel caso. Invece, controlla questo episodio da Railscasts che parla di attributi virtuali che non entrano nel database ma possono ancora essere utilizzati per le convalide.

Non è necessario un attributo modello corrispondente per gli attributi virtuali. Definire gli attributi locali alla classe come @no_fairways che mantengono lo stato.

class ScoreCard < ActiveRecord::Base 
    # define attributes and accessors for both fields 
    attr_accessor :no_fairways, :no_girs 

    .. 
end 

Ora all'interno si forma, si può solo scrivere:

<% form_for @scorecard %> 
    <%= f.check_box :no_fairways %> 
<% end %> 
+0

Questa sarebbe un'ottima soluzione, ma potresti fornire un esempio di come potrei implementarlo? In quel particolare Railscast gli "attributi virtuali" sono in realtà metodi che manipolano gli attributi reali. Non ho attributi a cui possa essere associato 'no_fairways' o' no_girs'. – Jay

+0

@James: l'attributo virtuale non deve essere associato ad alcun attributo del database. È possibile definire attributi di istanza che funzioneranno altrettanto bene. Risposta aggiornata – Anurag

+0

Nota che attr associato a checkbox non ha valore trythy o falsy. Di default 'check_box' genera markup che risulta nella stringa' "0" 'quando deselezionata e' "1" 'quando selezionata. Anche "0" .present? "È vero. – kolen

3

trovato la soluzione, grazie per il gergo, però, "l'attributo virtuale" hanno contribuito con il Google searchin.

Il modo più semplice per ottenere ciò è creare attributi che non fanno parte del database ma fanno ancora parte del modello. Nel mio caso inserisco questo nel modello:

attr_accessor :no_fairways 
attr_accessor :no_girs 

Che facile! Ora @scorecard.no_fairways e @scorecard.no_girs si comportano come qualsiasi altro attributo ma non fanno parte del database.

Problemi correlati