使用jsonapi-resources,上下文总是为零

时间:2015-10-24 15:59:46

标签: ruby-on-rails json-api jsonapi-resources

将jsonapi-resources gem的版本0.6.0与Doorkeeper结合使用我在查看资源中context对象中的当前用户时遇到问题。

我基本上关注the docs,但是我尝试的任何内容都不会使我在context中设置的ApplicationController在资源的fetchable_fields方法中可见。我确认context实际上已设置了ApplicationController

这就是我所拥有的

的ApplicationController

class ApplicationController < JSONAPI::ResourceController
  protect_from_forgery with: :null_session

  def context
    {current_user: current_user}
  end
end

控制器

class Api::ItemsController < ApplicationController
  prepend_before_action :doorkeeper_authorize!
end

资源

class Api::ItemResource < JSONAPI::Resource
  # attributes

  def fetchable_fields
    # context is always nil here
    if (context[:current_user].guest)
      super - [:field_i_want_private]
    else
      super
    end
  end
end

3 个答案:

答案 0 :(得分:0)

好吧,使用在jsonapi资源之上创建的jsonapi-utils gem - 你会写这样的东西:

的ApplicationController:

class ApplicationController < JSONAPI::ResourceController
  include JSONAPI::Utils
  protect_from_forgery with: :null_session
end

上述ItemsController:

class API::ItemsController < ApplicationController
  prepend_before_action :doorkeeper_authorize!
  before_action :load_user

  def index
    jsonapi_render json: @user.items
  end

  private

  def load_user
    @user = User.find(params[:id])
  end
end

无需定义上下文: - )

我希望它可以帮到你。干杯!

答案 1 :(得分:0)

context中不需要ApplicationController方法。实际上可以通过框架在Resource类中使用上下文。在您的资源中,您可以访问:

@context[:current_user]

答案 2 :(得分:0)

以您的示例为例,这是我的解决方法

资源

class Api::ItemResource < JSONAPI::Resource
  # attributes

  def fetchable_fields
    # context is always nil here
    if (context[:current_user].guest)
      super - [:field_i_want_private]
    else
      super
    end
  end

  # upgrade
  def self.create(context)
    # You can use association here but not with association table
    # only works when `id` is inside the table of the resource
    ItemResource.new(Item.new, context)
  end

  before_save do
    # Context is now available with `self.context`
    self.context[:current_user]
  end
end