2012-12-08 4 views
0

사용자가 제출할 때 사용자가 로그인하지 않은 경우 로그인하라는 모달 프롬프트가 나타납니다. 사용자가 로그인하면 모달이 사라지지만 양식의 제출 버튼을 다시 클릭해야합니다. 성공적으로 로그인 한 후 모달이 사라지고 양식이 자동으로 제출되면 좋을 것입니다.RJS를 사용하여 .js.erb 파일에서 보낸 사람을 제출하려면 어떻게해야합니까?

그래서 내부에 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 

답변

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() + '" />'); }); 
+0

감사합니다. 비슷한 결과를 얻었습니다. 유일한 차이점은 컨트롤러 안의 추적 코드를 삭제하고 세션을 삭제하지 않고'sessions/create.js.erb'에서 삭제한다는 것입니다. 접근 방법이 더 좋을 수도 있습니다. – Mohamad

관련 문제