0

ユーザーが送信し、ユーザーがサインインしていない場合、ログインするためのモーダルプロンプトを受け取るフォームがあります。ユーザーがログインすると、モーダルは消えますが、フォームの送信ボタンを再度クリックする必要があります。サインインに成功した後、モーダルが消えてフォームが自動的に送信されるとよいでしょう。

そのため、内部sessions/create.js.erbに次を追加しました。

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

これは機能しますが、スケーラブルではありません。#new_responseまず第一に、私は似たような振る舞いを必要とする他のフォームを持っているかもしれません - だけではありません. そのため、新しいフォームを追加するたびに、編集create.js.erbして追加する必要がありif (form exists) submit();ます。サインインにモーダルが使用されているが、フォームがまったく含まれていない場合もあります。

sessions/create.js.erbフォームが存在する場合にのみフォームを送信するように指示するフックを添付する方法はありますが、フォーム ID の知識はありませんか? 基本的に、それは合格しています。

# 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
4

1 に答える 1

1

何らかの方法を使用して、どのフォームが送信をトリガーしたかを追跡できます。

# 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() + '" />'); });
于 2012-12-08T14:06:53.810 に答える