使用ajax请求设计会话销毁我应该如何处理

时间:2012-04-23 11:49:09

标签: ruby-on-rails ruby-on-rails-3 session jquery devise

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

现在如果用户已登录会显示一个链接,并说明

NOT USER NAME ”例如“ NOT VIREN NEGI ”针对该电子邮件字段,该字段将是ajax request.to销毁设计会话

一旦用户点击链接,设计会话将被销毁,并且在ajax成功时,上面的锚标签将会消失

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

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的所有其他动作方法,以便设计没有任何问题
  3. 任何人都可以帮助我

    请避免回答monkeypatching是不好的要求我阅读monkeypatching所有这些东西(我知道),为什么问题发布。

    谢谢

2 个答案:

答案 0 :(得分: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

这将使您免于moneypatching devise#sessions controller

希望这个帮助

答案 1 :(得分:0)

您需要添加csrf元标记以进行请求。我认为这是问题,而不是设计。

这应该解决它

$.ajaxSetup({
  'beforeSend': function(xhr) { xhr.setRequestHeader('X-CSRF-Token', $("meta[name='csrf-      token']").attr('content')); }
});