我在rails5中使用Active Model Serializer 0.10.7
我想知道如何在序列化程序中访问devise current_user。
默认情况下,current_user应设置为范围。
根据文件
但我的代码效果不好......
有人知道吗?
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
答案 0 :(得分:1)
Devise不会将current_user
帮助程序暴露给模型或序列化程序 - 您可以将值从控制器传递给模型,或者将其设置在某个存储区中。
其他答案中的一些例子:
答案 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