2012-11-27 11 views
5

Ho una forma che ha un sacco di campi presi da una matrice (non dal modello o un oggetto). Come posso convalidare la presenza di questi campi?Come convalidare un non-modello (e anche non-oggetto) campo

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

Convalida tramite Javascript. – MurifoX

+0

@MurifoX non è abbastanza buono, cosa succede se l'utente ha disattivato javascript o invia comunque la richiesta? La convalida deve essere eseguita anche sul lato server. – Intrepidd

risposta

7

creare una classe semplice per avvolgere il richiedere i parametri e utilizzare 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 

Questo ti dà il vantaggio di convalidare come faresti un modello, completo di messaggi di errore i18n e così via.

EDIT: secondo il vostro commento, per convalidare tutto ciò che si potrebbe fare:

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

Sembra essere molto meglio. Ma che ne pensi di aggiungere una convalida non vuota per tutte le nuove proprietà? – freemanoid

+0

sì sì per la soluzione OpenStruct – equivalent8

1

È possibile effettuare le seguenti operazioni con 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:

Questa può essere una soluzione molto migliore: http://yehudakatz.com/2010/01/10/activemodel-make-any-ruby-object-feel-like-activerecord/

+0

Ho una matrice di campi e non esiste una struttura precedentemente nota perché non riesco a creare un oggetto ActiveModel con la convalida all'interno. – freemanoid

+0

Non hai nemmeno un modello di record attivo che agisca in questo modo? In questa situazione dovrai crearne uno che funga solo da involucro di validazione o fallo da solo. – Intrepidd

+0

Ok. Posso creare un modello solo per la convalida. Quindi dovrei aggiungere campi dalla matrice in questo modello e impostare le convalide su quei campi? – freemanoid

Problemi correlati