0

我有一个表单,用户可以在其中填写包含email_id列的表单字段的详细信息

现在,如果用户已登录,则会出现一个链接说明

NOT USER NAME ”例如“ NOT VIREN NEGI ”反对那个电子邮件字段,这将是一个ajax请求。破坏设计会话

一旦用户单击链接,设计会话将被破坏,并且在 ajax 成功时,上述锚标记将消失

我已经通过 Moneypatching Devise 的 destroy 方法实现了这个解决方案,例如

class DeviseSessionsController < DeviseController

  def destroy
    .... DEVISE CODE ...
    .... DEVISE CODE ...
    .... DEVISE CODE ...

     respond_to do |format|
       if request.xhr? **## My Hack**
         format.js { render :partial => 'users/signout' } **## render signout partial on ajax request** 
       else 
         format.any(*navigational_formats) { redirect_to redirect_path }
        format.all do
          method = "to_#{request_format}"
          text = {}.respond_to?(method) ? {}.send(method) : ""
          render :text => text, :status => :ok
       end
     end 
    end
  end
end

虽然这一切似乎都有效,但因为但我对此并不满意

  1. 如果设计已更新,则不适合,并且将来的销毁方法可能看起来与当前不同
  2. 我已经复制了 devise/sessions_controller 的所有其他操作方法,以使设计工作没有任何问题

谁可以帮我这个事

请避免回答monkeypatching 不好让我阅读有关monkeypatching 的所有内容(我知道),这就是为什么发布问题的原因。

谢谢你

4

2 回答 2

2

您可以使用设计辅助方法注销

在用户控制器中创建一个动作

def log_me_out 
   signed_out = (Devise.sign_out_all_scopes ? sign_out : sign_out(resource_name))
    respond_to do |format|
      format.js  { render :partial => 'log_me_out',:layout => false }
    end
end

这将使您免于资金修补设计#sessions 控制器

希望这有帮助

于 2012-04-24T07:59:55.130 回答
0

您需要添加 csrf 元标记来请求。我认为这是问题所在,而不是在设计中。

这应该解决它

$.ajaxSetup({
  'beforeSend': function(xhr) { xhr.setRequestHeader('X-CSRF-Token', $("meta[name='csrf-      token']").attr('content')); }
});
于 2012-04-23T13:13:20.477 回答