it-swarm-pt.tech

envie um formulário remoto Rails remoto com javascript

No meu aplicativo Rails, tenho um formulário remoto que se parece com isso, por exemplo:

<%= form_tag some_path, :method => :get, :id => 'my-form', :remote => true do %>
  <%= text_field_tag :search, params[:search], :id => 'search-field' %>
  <%= submit_tag 'Go' %>
<% end %>

Agora, eu gostaria de enviar este formulário via javascript e acionar todos os retornos de chamada Rails de formulário remoto. Até agora, tentei algumas coisas, mas nada parece estar funcionando.

Coisas que tentei:

$('#my-form').trigger('onsubmit')

$.Rails.callFormSubmitBindings( $('#search-form') )

mas sem sorte até agora. Alguma ideia?

26
Matthew

Você pode apenas usar .submit ();

$("#my-form").submit();
1
andrewpthorp

Em Rails 5.1+, que substitui o antigo jquery-ujs com um não-jquery Rails-ujs, as respostas acima não funcionam mais, sempre enviando o formulário por meio de uma solicitação HTTP em HTML. É assim que você aciona o novo manipulador de eventos Rails submit):

var elem = document.getElementById('myform') // or $('#myform')[0] with jQuery
Rails.fire(elem, 'submit');

(Não posso dizer quanto tempo demorei para descobrir isso ...) Por algum motivo, os eventos regulares não são apropriados para o manipulador de eventos delegados anexado pelo Rails usando o Rails 'new função delegada , quando são acionados pelo jQuery.

68
mltsy

Isto é simplesmente da forma Rails):

 $("#myform").trigger('submit.Rails');
67
Gopal S Rathore

Que tal usar Rails_ujs E simplesmente fazer o seguinte:

Rails.fire(form, 'submit');

(onde form é um elemento DOM)

Parece uma maneira Rails adequada de fazer isso.

Você pode conferir a fonte aqui - https://github.com/Rails/rails/blob/master/actionview/app/assets/javascripts/Rails-ujs/utils/event.coffee#L34

10
Mladen Ilić

Que tal passar o json do controlador e capturá-lo pelos seus js.

Agora, a ação do controlador como

respond_to do |format|
      if some condition
        format.json { render :json => {:success => true} }
        format.html{ redirect_to some_path, :notice => "successfully created" }
      else
        ...
      end
end

E capturando o json em js como

$('#my-form').bind 'ajax:success', (event,data) ->
  if(data.success == true)
    ...

Não é exatamente o que você está procurando, mas espero que isso ajude.

3
prasvin

Estou atualizando a resposta para Rails 6.

Se você está tendo esse problema no Rails 6, é provável que você tenha esquecido de adicionar o parâmetro "formato:: js" ao criador de formulários).

<%= form_tag some_path, :method => :get, :id => 'my-form', :remote => true,
         :format => :js do %>
  <%= text_field_tag :search, params[:search], :id => 'search-field' %>
  <%= submit_tag 'Go' %>
<% end %>

Você também precisará incluir um format.js no seu controlador.

def update
    respond_to do |format|
      if @model.update(user_params)
        format.html { redirect_to @model, notice: 'Model was successfully updated.' }
        format.json { render :show, status: :ok, location: @model }
        format.js {
          logger.debug "this will run in the update was ok."
        }
      else
        format.html { render :edit }
        format.json { render json: @model.errors, status: :unprocessable_entity }
        format.js {
          logger.debug "this will run in the update was not ok."
        }
      end
    end
  end

Agora, no JavaScript, você pode simplesmente chamar o envio para este formulário regularmente.

this.form.submit()
1
mentatkgs

Sei que esse é um tópico antigo, mas estou lutando com isso há algum tempo e finalmente encontrei uma solução.

Eu tinha um formulário com remote: true Que incluía um file_field E queria que o formulário fosse enviado automaticamente assim que o usuário adicionasse o arquivo. Eu tentei onchange: form.submit(); mas dessa forma o formulário foi enviado como HTML.

Minha solução: clicar no botão de envio de formulário (oculto) com JS:

onchange: $("#submit-button").click();
1
Jonas

A resposta @mltsy funciona perfeitamente para mim. No entanto, queria reiterar que isso requer o uso do Rails-ujs. Se você atualizou de uma versão mais antiga como eu, ainda pode estar usando o jquery_ujs dependente de jquery. Se você está recebendo ReferenceError: Can't find variable: Rails em seu console, verifique seu application.js e verifique se a resposta ótima do Rails-ujs ou @ mltsy não funcionará. Eu queria deixar um comentário em vez de uma resposta, mas o Stack não me deixou.

1
James Hong