grupos de validação para as formas de estilo assistente
-
09-09-2019 - |
Pergunta
Alguém pode explicar-me, como fazer formas assistente de estilo com validações?
F.E.:.
Eu tenho uma consulta de modelo, que deve incluir seguintes dados: nome, starttime, endtime, endereço, cidade.
Agora eu quero ter 3 ações para cada Datagroup:
- nome
- começar e enddate
- -endereços campos
cada um deles deve ser acessível (Assim AASM não é uma opção eu acho -> model.wizard_step = 3 e gerando a visão certa para este bastante passo is not).
E cada um deles deve ter validações
- nome não deve ser nulo
- startdate não deve ser depois enddate
- addressfields não deve ser nulo
Mas como posso salvar este objeto entre as etapas individuais, e como construir neste validações schemas / grupos ...?
heeelp .. thanks =)
Solução
Você pode usar o gem agrupados validações para este: https://github.com/adzap/grouped_validations
Outras dicas
Combine um campo escondido em seu formulário:
f.hidden_field :wizard_stage, :value => '<current action>'
com algo como isto
class Appointment < ActiveRecord::base
attr_accessor :wizard_stage
validates_presence_of :name, :if => lambda{|a| a.wizard_stage == 'name'}
validates_presence_of [:start, :end], :if => lambda{|a| a.wizard_stage = 'dates'}
end
Você vai ter que basicamente "rolo seu próprio" em um presente. O mais próximo que você pode obter com o Rails padrão / funcionalidade ActiveRecord é fazer algo como o seguinte:
class WizardController < ApplicationController
def wizard_1
foo = Foo.new params[:foo]
foo.valid?
if %{name}.any? {|att| foo.errors.on(att) }
# failed pseudo-validation
else
render :wizard_2
end
end
def wizard_2
foo = Foo.new params[:foo]
foo.valid?
if %{name startdate enddate}.any? {|att| foo.errors.on(att) }
# failed pseudo-validation
else
render :wizard_3
end
end
def wizard_3
# standard rails Controller#create
end
end
E você vai ter que passar ao longo das variáveis ??de cada etapa em campos escondidos na próxima. Você também pode querer considerar simplesmente fazendo isso em um estágio, em vez de três.
você não pode apenas usar: se
por exemplo.
validates_presence_of :name
validates_presence_of :address_fields, :if => Proc.new {|p| p.startdate && p.enddate}
def validate
unless name.blank?
errors.add(:startdate) if startdate > enddate
end
end