2012-11-27 14 views
5

Mam formularz, który ma wiele pól pobranych z tablicy (nie z modelu lub obiektu). Jak mogę sprawdzić obecność tych pól?Jak sprawdzić poprawność pola innego niż model (a nawet nieobiektowego)

<%= simple_form_for :solve, :url => solve_problem_path do |f| %> 
    <% @input_variables.each do |label| %> 
    <%= f.input label %> 
    <% end %> 
    ... 
<% end %> 
+0

Sprawdź poprawność przy pomocy Javascript. – MurifoX

+0

@MurifoX nie jest wystarczająco dobry, co jeśli użytkownik dezaktywował javascript lub mimo to wysyła żądanie? Sprawdzanie poprawności musi również odbywać się po stronie serwera. – Intrepidd

Odpowiedz

7

utworzyć prostą klasę do zawijania żądaj parametrów i użyj ActiveModel::Validations.

# defined somewhere, at the simplest: 
require 'ostruct' 

class Solve < OpenStruct 
    include ActiveModel::Validations 
    validates :foo, :bar, :presence => true  

    # you could even check the solution with a validator 
    validate do 
    errors.add(:base, "WRONG!!!") unless some_correct_condition 
    end 
end 

# then in your controller 
def your_method_name 
    @solve = Solve.new(params[:solve]) 

    if @solve.valid? 
    # yayyyy! 
    else 
    # do something with @solve.errors 
    end 
end 

Daje to korzyści sprawdzania poprawności, podobnie jak model, wraz z komunikatami o błędach i18n i tak dalej.

EDIT: jak na swój komentarz, aby potwierdzić wszystko może zrobić:

class Solve < OpenStruct 
    include ActiveModel::Validations 

    # To get the i18n to work fully you'd want to extend ActiveModel::Naming, and 
    # probably define `i18n_scope` 
    extend ActiveModel::Naming 

    validate do 
    # OpenStruct maintains a hash @table of its attributes 
    @table.each do |key, val| 
     errors.add(key, :blank) if val.blank? 
    end 
    end 
end 
+0

Wydaje się być znacznie lepszy. Ale co z dodaniem niepustego sprawdzania poprawności dla wszystkich nowych właściwości? – freemanoid

+0

duże tak dla rozwiązania OpenStruct – equivalent8

1

można wykonać następujące czynności z attr_accessible:

Class YourClass < ActiveRecord::Base  
    attr_accessible :field_1 
    attr_accessible :field_2 

    validates :field_1, :presence => true 
    validates :field_2, :presence => true 
end 

EDIT:

To może być dużo lepsze rozwiązanie: http://yehudakatz.com/2010/01/10/activemodel-make-any-ruby-object-feel-like-activerecord/

+0

Mam tablicę pól i nie ma wcześniej znanej struktury, ponieważ nie mogę utworzyć obiektu ActiveModel z walidacją wewnątrz. – freemanoid

+0

Nie masz nawet jednego aktywnego modelu rekordu działającego w tym formularzu? W tej sytuacji musisz albo utworzyć taki, który będzie działał jako opakowanie sprawdzania poprawności, albo zrobić to samemu. – Intrepidd

+0

Ok. Mogę stworzyć model tylko po to, aby go zweryfikować. Następnie powinienem dodać pola z tablicy do tego modelu i ustawić walidacje na tych polach? – freemanoid

Powiązane problemy