Pergunta

Eu estou tendo um modelo bastante complexo, com muitos campos, associações has_many, imagens adicionadas por image_column etc ...

O novo objeto será adicionado por um formulário com várias páginas (8 passos) -? Como devo realizar a validação e propagação entre esses passos

Eu acho validation_group poderia ser útil para a definição de validações para cada etapa, o que acontece com design geral?

Foi útil?

Solução

Para design geral, você pode querer olhar para o conceito de uma camada Apresentador (Jay Campos define em seu blog Rails:. Presenter Padrão ) como uma maneira de manter seus controladores fina e vistas estúpido quando se lida com modelos complexos / múltipla

Outras dicas

Você poderia ter uma série de métodos, por exemplo, step_1, step_2, e cada um verifica se os dados necessários a partir do passo anterior foi submetido. Você pode armazenar dados na sessão de modo que, por exemplo, o passo 3 ainda teria acesso a todos os dados recolhidos e analisados ??na etapa 1. Na etapa final, colocar todos os dados que você armazenou na sessão mais a dados a partir do penúltimo passo para o uso, e criar uma nova linha no banco de dados ou o que você está reunindo os dados para. Se um usuário mexe-se um passo, redirecioná-los para a etapa anterior e preencha o formulário para eles com os dados que eles fizeram preencher; por exemplo. se os messes de usuários até o passo 2 e envia o formulário levando a etapa 3, pegar o problema em seu método step_3, redirecionar o usuário para o método step_2 e certifique-se os elementos de formulário no passo 2 são pré-cheia.

Se você não quiser armazenar dados na sessão que você vá, você pode criar uma nova linha de banco de dados depois que o usuário tenha apresentado o passo 1 e apenas atualizar os campos nessa linha como você reunir novos dados em cada passo sucessivo . Você poderia ter alguma bandeira de 'completa' na linha, definindo-o inicialmente a 0 e, em seguida, definindo-o como 1 após o usuário ter concluído com êxito todas as etapas.

Você também pode permitir que os usuários de ir para etapas anteriores (por exemplo, permitir que o usuário retorne ao passo 3, quando ele está no passo 5).

Say o primeiro passo tem um formulário com campos 'nome' e 'e-mail'. No seu método de step_2, você deve verificar se params[:name] e params[:email] foram passados ??e são válidos. Armazenar aqueles na sessão ou uma linha de banco de dados, no entanto que você escolheu. Em seguida, na etapa 2, você tem um formulário com campos 'idade' e 'gênero'. No seu método de step_3, você deve verificar se params[:age] e params[:gender] foram passados ??e são válidos, e você também precisa garantir que o usuário tenha concluído a etapa 1, para impedir que um usuário digitando a URL para acesso a etapa 3 diretamente. E assim por diante.

class Campaign < ActiveRecord::Base
    with_options(:if => lambda { |campaign| campaign.on_or_past_step(:spam_can) }) do |spam_can|
      spam_can.validates_associated  :spam_can
      spam_can.validates_presence_of :spam_can
    end
  def on_or_past_step
   :
   :
  end
end

este é um trabalho em progresso, mas eu sinto que estou no caminho certo. Estou usando AASM estados para determinar quais validações para ser executado. Eu ainda não tenho trabalhado para fora como as rotas deve funcionar, como o modelo em questão no meu caso é um recurso. por exemplo, qual grupo de campos deve ser a ação de edição?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top