如何在活动模型序列化程序中使用设计 current_user

Ota*_*uzo 5 ruby-on-rails devise active-model-serializers

我在 rails5 中使用 Active Model Serializer 0.10.7

我想知道如何在序列化程序中访问设计 current_user。

current_user 应该默认设置为范围。

根据文档

https://github.com/rails-api/active_model_serializers/blob/0-10-stable/docs/general/serializers.md#controller-authorization-context

但我的代码不能正常工作...

有人知道这个吗?

class BookSerializer < ActiveModel::Serializer

  attributes :id, :title, :url, :image, :is_reviewed

  def is_reviewed
    object.reviews.pluck(:user_id).include?(current_user.id)
  end
end 
Run Code Online (Sandbox Code Playgroud)

和 Book 控制器看起来像这样。

class BooksController < ApplicationController
  def index
    @books = Book.order(created_at: :desc).page(params[:page])
    respond_to do |format|
      format.html
      format.json {render json: @books, each_serializer: BookSerializer}
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

L.Y*_*oul 5

在控制器(或其他地方)实例化序列化器时,可以将范围传递到序列化器中。我明白这是针对单个对象而不是对象数组:

BookSerializer.new(book, scope: current_user)
Run Code Online (Sandbox Code Playgroud)

然后Book Serializer你可以这样做:

class BookSerializer < ActiveModel::Serializer

  attributes :id, :title, :url, :image, :is_reviewed

  private

  def is_reviewed
    object.reviews.pluck(:user_id).include?(current_user.id)
  end

  def current_user
    scope
  end
end 


Run Code Online (Sandbox Code Playgroud)


Ana*_*and -1

似乎有一个拼写错误,你已经is_reviewed定义了方法has_reviewed ,所以它应该是这样的

class BookSerializer < ActiveModel::Serializer

  attributes :id, :title, :url, :image, :is_reviewed

  def is_reviewed
    object.reviews.pluck(:user_id).include?(current_user.id)
  end
end 
Run Code Online (Sandbox Code Playgroud)