2014-08-31 32 views
6

Dies ist das erste Mal, dass ich bin Aufzählungen mit Schienen 4 und ich lief in einige Probleme mit, haben einige schmutzige Lösungen im Sinn und wollten gibt es keine elegantere Lösungen an seinem Platz überprüfen:Rails 4 ENUM Validierung

Dies ist meine Tabelle Migration relevanter Teil:

create_table :shippings do |t| 
    t.column :status, :integer, default: 0 
end 

Mein Modell:

class Shipping < ActiveRecord::Base 
    enum status: { initial_status: 0, frozen: 1, processed: 2 } 
end 

Und ich habe dieses Stück meiner Meinung nach (mit einfacher Form für):

= f.input :status, :as => :select, :collection => Shipping.statuses, :required => true, :prompt => 'Please select', label: false 

Also in meinem Controller:

def create 
    @shipping = Shipping.create!(shipping_params) 

    if @shipping.new_record? 
     return render 'new' 
    end 

    flash[:success] = 'Shipping saved successfully' 
    redirect_to home_path 
    end 

private 

    def shipping_params 
    params.require(:shipping).permit(... :status) 
    end 

Also, wenn ich Formular erstellen und senden die Aktion Feuer erzeuge ich diese Validierung Fehlermeldung erhalten:

'1' is not a valid status 

Also dachte ich, ich, dass die Frage wusste war der Datentyp, also habe ich dieses Bit in das Modell eingefügt:

Aber das schien nichts zu tun, wie löste ich das? Hat jemand ähnliche Erfahrungen gemacht?

Antwort

3

Sie können die Lösung here finden.

Grundsätzlich müssen Sie die Zeichenfolge übergeben ('initial_status', 'eingefroren' oder 'verarbeitet'), nicht die ganze Zahl. Mit anderen Worten, braucht Ihre Form wie folgt aussehen:

<select ...><option value="frozen">frozen</option>...</select> 

Sie dies durch statuses.keys in Ihrem Formular erreichen zu tun. Auch (glaube ich) brauchst du die before_validation nicht.

Optional können Sie auch eine Validierung wie folgt hinzu:

validates_inclusion_of :status, in: Shipping.statuses.keys 

Aber ich bin nicht sicher, dass diese Prüfung sinnvoll ist, da versucht, einen ungültigen Wert auf Status löst eine Argument (see this) zuzuordnen.