Po niektóre spojrzenie, nie mogłem znaleźć jedno-liner w modelu, aby pomóc się zdarzyć. Do tej pory, Szyny zapewnia wyliczenia, ale nie sposób kompleksowy do sprawdzania nieprawidłowych wartości.
Tak więc zdecydowałem się na rozwiązanie złożone: Aby dodać sprawdzanie poprawności w kontrolerze, przed ustawieniem strong_params
, a następnie poprzez sprawdzenie względem modelu.
Tak, w modelu, to stworzy atrybut i walidacji niestandardowe:
uczestniczyć.rb
enum :status => { your set of values }
attr_accessor :invalid_status
validate :valid_status
#...
private
def valid_status
if self.invalid_status == true
errors.add(:status, "is not valid")
end
end
Również zrobię test przed parametrów nieprawidłowej wejścia i wysłać wynik (jeśli to konieczne) do modelu, więc błąd zostanie dodana do obiektu, dzięki czemu jest nieważny
attends_controller.rb
private
def attend_params
#modify strong_params to include the additional check
if params[:attend][:status].in?(Attend.statuses.keys << nil) # to also allow nil input
# Leave this as it was before the check
params.require(:attend).permit(....)
else
params[:attend][:invalid_status] = true
# remove the 'status' attribute to avoid the exception and
# inject the attribute to the params to force invalid instance
params.require(:attend).permit(...., :invalid_status)
end
end
mu i odpowiedzi Mike'a są dobre - patrz też http://stackoverflow.com/q/265725/887124, co daje trochę inne odpowiedzi na podobne pytanie. –
Tak, faktycznie używam czegoś bardziej podobnego do rozwiązania, które dostarczył Bob: [gist] (https://gist.github.com/1372650) – mnelson