Domanda

I have a form that, when the user submits, and the user is not signed in, they receive a modal prompt to login. Once the user logs in, the modal disappears, but they have to click the submit button on the form again. It would be nice if, after successfully signing in, the modal disappeared and the form submits automatically.

So inside sessions/create.js.erb I added the following.

# create.js.erb
<% if signed_in? %>
    $('#ajax-modal').modal('hide').empty();
    $('#new_response).submit();
<% else %>
    $('#ajax-modal').html('<%= j render("sessions/form") %>').modal();
<% end %>

This works, but it's not scalable. Firs of all, I might have other forms--not just #new_response--that require a similar behaviour. So each time I add a new form I have to edit create.js.erb and add an if (form exists) submit();. There are also other times when the modal is used for signing in but no forms are involved at all.

Is there a way to attach a hook to tell sessions/create.js.erb to submit the form only when one exists, but without having any knowledge of the form id? Basically, have that passed in.

# responses/_form.html.slim
= form_for [@discussion, @response], remote: true do |f|
    = f.label :content, "Comments"
    = f.text_area :content, rows: 8
    = f.submit "Reply", class: 'btn btn-success reply', 'data-disable-with' => "Reply"

# Responses controller
class ResponsesController < ApplicationController
  before_filter :require_authentication, except: :index
  ...

  def require_authentication
    redirect_to signin_path unless signed_in?
  end
end
È stato utile?

Soluzione

You can use some sort of way to track which form triggered the submit, e.g.

# ResponsesController
class ResponsesController < ApplicationController
  before_filter :require_authentication, except: :index

  def require_authentication
    session[:form_track_code] = params[:form_track_code] if [:put, :post].include?(request.method_symbol) && params[:form_track_code].present?

    redirect_to signin_path unless signed_in?
  end
end

# SessionsController
class SessionsController < ApplicationController # or devise?
  def create
    @form_track_code = session.delete[:form_track_code]
    super # or whatever you implemented
  end
end

# create.js.erb
<% if signed_in? %>
    $('#ajax-modal').modal('hide').empty();
    <% if @form_track_code.present? %>
      $('input[type=hidden][value="<%= @form_track_code %>"]').parents('form').submit();
    <% end %>
<% else %>
    $('#ajax-modal').html('<%= j render("sessions/form") %>').modal();
<% end %>

# application.js
$('form[data-remote=true]').each(function() { $(this).append('<input type="hidden" name="form_track_code" value="' + Math.random() + '" />'); });
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top