4

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

我基本上遵循文档,但是我尝试的任何方法都不会使我在资源的方法中context设置为ApplicationController可见。fetchable_fields我确实确认这context实际上是在我的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
4

3 回答 3

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
于 2020-02-11T11:13:45.063 回答
0

好吧,使用jsonapi-utils gem——它是在 jsonapi-resources 之上创建的——你会写这样的东西:

应用控制器:

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

物品控制器:

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

无需定义上下文:-)

我希望它对你有帮助。干杯!

于 2016-03-10T22:53:01.620 回答
-1

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

@context[:current_user]
于 2016-08-09T00:02:03.030 回答