【问题标题】:How to get current_user in Rails 5 API with Devise如何使用 Devise 在 Rails 5 API 中获取 current_user
【发布时间】:2016-11-16 21:31:06
【问题描述】:

我有一个 Angular 2 应用程序,它使用 Rails 5 API 创建项目(想想帖子)。我试图在创建时将 current_user id 添加到新项目(请参阅 Projects 控制器中的尝试),但我得到 NoMethodError(未定义的方法projects' for nil:NilClass): app/controllers/projects_controller.rb:18:increate'。第 18 行是在创建时尝试使用 current_user 的行项目。如果我删除当前用户并使其成为 Project.new 或者如果我在客户端对 user_is 进行硬编码,则没有问题,但有很多用户,这将是一个问题。最后,我想知道如何获取当前用户id并在创建项目时插入。

应用程序控制器

class ApplicationController < ActionController::API
  include DeviseTokenAuth::Concerns::SetUserByToken

  def current_user
    @current_user
  end

end

项目控制器

def create
  @project = current_user.projects.new(project_params)

  if @project.save
    render :show, status: :created, location: @project
  else
    render json: @project.errors, status: :unprocessable_entity
  end
end

【问题讨论】:

标签: ruby-on-rails devise ruby-on-rails-5


【解决方案1】:

看起来您还没有调用设置current_userauthenticate_user! 方法。

也许尝试让您的ApplicationController 看起来像这样......

class ApplicationController < ActionController::API
  include DeviseTokenAuth::Concerns::SetUserByToken

  before_action :authenticate_user!
end 

这里的before_action 调用确保current_user 方法返回一个值。

【讨论】:

  • 没有达到目标。简单抛出 401 如下: DeviseTokenAuth::SessionsController#create 作为 JSON 参数处理: {"email"=>"jim@iss.com", "password"=>"[FILTERED]", "session"=>{ "email"=>"jim@iss.com", "password"=>"[FILTERED]"}} [active_model_serializers] 渲染 ActiveModel::Serializer::Null with Hash (0.19ms) 过滤器链停止为 :authenticate_user!渲染或重定向完成 401 Unauthorized in 5ms (Views: 3.8ms | ActiveRecord: 0.0ms)
【解决方案2】:

已解决。问题是 angular2-token 没有为后续请求传递正确的标头,以便对非身份验证路由(例如我的项目路由)进行后续请求。 current_user 现在可以开始了。

【讨论】:

  • 我遇到了类似的问题,你是如何使用 angular2-token 添加正确的标题的?
猜你喜欢
  • 2017-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多