如何在Active Model Serializers

时间:2017-12-14 09:12:03

标签: ruby-on-rails devise active-model-serializers

我在rails5中使用Active Model Serializer 0.10.7

我想知道如何在序列化程序中访问devise 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 

和书籍控制器看起来像这样。

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

5 个答案:

答案 0 :(得分:1)

Devise不会将current_user帮助程序暴露给模型或序列化程序 - 您可以将值从控制器传递给模型,或者将其设置在某个存储区中。

其他答案中的一些例子:

https://stackoverflow.com/a/3742981/385532

https://stackoverflow.com/a/5545264/385532

答案 1 :(得分:1)

应用程序控制器中的

class ApplicationController < ActionController::Base
  ...
  serialization_scope :view_context


end
串行器中的

class BookSerializer < ActiveModel::Serializer

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

  def is_reviewed
    user = scope.current_user
    ...
  end
end 

答案 2 :(得分:1)

如果您使用的是active_model_serializers gem,那么它就很简单。

在序列化程序中,只需使用关键字scope

例如:-

class EventSerializer < ApplicationSerializer
  attributes(
    :id,
    :last_date,
    :total_participant,
    :participated
  )

  def participated
    object.participants.pluck(:user_id).include?(scope.id)
  end
end

答案 3 :(得分:0)

似乎有拼写错误,你有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 

答案 4 :(得分:0)

在控制器中(或其他方面)实例化作用域时,可以将作用域传递给序列化器。我赞赏这是针对单个对象而不是对象数组的

BookSerializer.new(book, scope: current_user)

然后在您的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