2012-01-13 14 views
16

Jestem całkiem nowy Rails i teraz natknąłem się na problem, który nie byłem w stanie rozwiązać z moim przyjacielem Google :)Railsy - jak sprawdzać poprawność pola, tylko jeśli inne pole ma określoną wartość?

W moim formularzu mam Wybierz z trzech wartości: Jabłko, Banana i Wiśnia. Jeśli wybiorę Apple z pola wyboru I chowaję pole wyboru i pole tekstowe z niektórymi Javascript, ponieważ po wybraniu Apple, nie ma już potrzeby wypełniania tych dwóch pozostałych pól.

Teraz mam problem z zatwierdzeniem mojego formularza po jego przesłaniu. Znalazłem kilka podobnych problemów na przykład w przypadku "Sprawdzaj tylko pole, jeśli inny jest pusty."

Ten problem został rozwiązany w ten sposób:

validates_presence_of :mobile_number, :unless => :home_phone? 

Więc ja tylko starałem pierwszą rzeczą, która wpadła mi myśl:

validates_presence_of :state, :granted_at, :if => :type != 1 

Ale kiedy go uruchomić, dostaję ten błąd :

undefined method `validate' for true:TrueClass 

Więc teraz ja nie dowiedzieć się, w jaki sposób mogę uzyskać dostęp do wartości z obiektu, który został stworzony ... Z góry dziękuję za pomoc i mam nadzieję, że moje pytanie nie jest tak oczywista, jak to brzmi :-)

Odpowiedz

27

Bo to jest kod wykonywalny trzeba zawinąć go w lambda lub obiektu Proc tak:

validates_presence_of :state, :granted_at, :if => lambda { |o| o.type != 1 } 

# alternatively: 
..., :if => lambda { self.type != 1 } 
..., :if => Proc.new { |o| o.type != 1 } 
..., :if ->(o) { o.type != 1 } 
+0

dziękuję za szybką odpowiedź :), ale co zawiera tę zmienną blokową "o"? obiekt, który jest sprawdzany? – TehQuila

+0

Tak, dokładnie. Przyjrzyj się także odpowiedzi @ Hauleth, gdzie znajdziesz inne sposoby rozwiązania problemu. Ostateczne odwołanie można znaleźć w dokumentacji API Railsów: http://ar.rubyonrails.org/classes/ActiveRecord/Validations/ClassMethods.html. Co więcej, proponuję, abyś google dla "ruby procs and blocks", aby dowiedzieć się o podstawowych (rubinowych) elementach kryjących się za tym. Nadzieja, która pomaga. – Matt

21

można użyć if flagi i lambda:

validates_presence_of :state, :granted_at, :if => lambda {self.type != 1} 

albo po prostu stworzyć metodę indywidualnego użytku:

validates_presence_of :state, :granted_at, :if => :valid_type? 

private 
def valid_type? 
    type != 1 
end 
1

mimo wyżej wymienionych sposobów są najlepsze praktyki, ale można też zrobić to proste tak:

validates_presence_of :state, :granted_at, :if => "type!=1" 
1

Opierając się na poprzednich odpowiedziach, można również użyć krótszego „strzałka” Składnia

validates :state, :granted_at, presence: true, if: ->(o) { o.type != 1 } 
Powiązane problemy