在sign_in之后,Devise不想返回JSON

时间:2014-02-14 08:43:15

标签: ruby-on-rails json devise ruby-on-rails-4

我尝试配置我的rails应用程序,以便能够通过JSON请求执行sign_in(该部分看起来工作),之后我不想被重定向,我只想让sign_in返回一个JSON与用户电子邮件和其他一些东西。

有人可以告诉我该怎么做吗? 我使用这个gem token authentication和设计的最后一个版本的rails。

目前我已经创建了一个自定义会话控制器,但我不知道该放入什么内容。 我是rails的新手,所以也许很容易,但我找不到最新的答案。

感谢的

更新:有关信息,我的主要目标是在sign_in成功后取回与用户关联的身份验证令牌

2 个答案:

答案 0 :(得分:3)

覆盖Devise :: SessionsController的会话创建方法

在app / controllers / users / sessions_controller.rb中添加一个控制器文件,并继承Devise :: SessionsController,如下所示。

class Users::SessionsController < Devise::SessionsController

  def create
    self.resource = warden.authenticate!(auth_options)
    set_flash_message(:notice, :signed_in) if is_flashing_format?
    sign_in(resource_name, resource)
    yield resource if block_given?
    respond_with resource, :location => after_sign_in_path_for(resource) do |format|
      format.json {render :json => resource } # this code will get executed for json request
    end
  end

end

在路由中添加以下内容以考虑继承的User :: SessionsController

devise_for :users, :controllers => { :sessions => 'users/sessions'}

答案 1 :(得分:2)

您还可以使用yield块创建其他代码并在返回重定向命令之前返回

Dim a As Variant
a = Array(1, 1, 1, 1, 1, 1, 1, 1, 1)

def create super do render json: { user: current_user, token: form_authenticity_token }.to_json and return end end 将阻止控制器在yield块之后继续。

and return - 我必须在登录后重置标头中的csrf-token。这是获取新csrf-token的一种方法。