Eu preciso ter vários botões de envio.
Eu tenho um formulário que cria uma instância de Contact_Call.
Um botão o cria normalmente.
O outro botão o cria, mas precisa ter um valor: attribute diferente do padrão e também precisa definir o atributo em um modelo diferente, mas relacionado, usado no controlador.
Como faço isso? Não posso mudar a rota, então há uma maneira de enviar uma variável diferente que é selecionada por [: params]?
E se eu fizer isso, o que eu faço no controlador, configurar uma declaração de caso?
ruby-on-rails
ruby
form-submit
Timothy T.
fonte
fonte
Respostas:
Você pode criar vários botões de envio e fornecer um valor diferente para cada um:
Isso resultará em:
Dentro do seu controlador, o valor do botão enviado será identificado pelo parâmetro
commit
. Verifique o valor para fazer o processamento necessário:No entanto, lembre-se de que isso une fortemente sua visão ao controlador, o que pode não ser muito desejável.
fonte
Também há outra abordagem, usando o atributo formaction no botão de envio:
O código permanece limpo, já que o botão de criação padrão não precisa de nenhuma alteração, você apenas insere um caminho de roteamento para o botão especial:
fonte
Você pode, alternativamente, reconhecer qual botão foi pressionado alterando seu nome de atributo.
É um pouco desconfortável porque você tem que verificar a presença das teclas de parâmetro ao invés de simplesmente verificar o
params[:commit]
valor: você receberáparams[:a_button]
ouparams[:b_button]
dependendo de qual foi pressionada.fonte
Solução semelhante a uma sugerida por @ vss123 sem usar nenhuma joia:
Observe que eu evito usar valor e uso o nome de entrada em vez disso, pois o valor do botão de envio é frequentemente internacionalizado / traduzido. Além disso, eu evitaria usar muito isso, pois isso bagunçaria rapidamente seu arquivo de rotas.
fonte
Resolvemos usando restrições avançadas em trilhos.
A ideia é ter o mesmo caminho (e, portanto, a mesma rota e ação nomeadas), mas com restrições de roteamento para ações diferentes.
CommitParamRouting
é uma classe simples que possui um métodomatches?
que retorna verdadeiro se o parâmetro commit corresponder ao atributo de instância fornecido. valor.Está disponível como uma gema commit_param_matching .
fonte
Uma pergunta antiga, mas como estou lidando com a mesma situação, pensei em postar minha solução. Estou usando constantes do controlador para evitar a introdução de uma discrepância entre a lógica do controlador e o botão de visualização.
E então na vista:
Dessa forma, o texto vive apenas em um lugar - como uma constante no controlador. Ainda não tentei descobrir como resolver isso ainda.
fonte
Eu tenho um número variável de botões de envio em meu formulário graças a nested_form_fields, então apenas usar o nome não foi suficiente para mim. Acabei incluindo um campo de entrada oculto no formulário e usando Javascript para preenchê-lo quando um dos botões de envio do formulário foi pressionado.
fonte