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:

  1. nome
  2. começar e enddate
  3. -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

  1. nome não deve ser nulo
  2. startdate não deve ser depois enddate
  3. 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 =)

Foi útil?

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top