AMS版本:0.9.7
我试图将参数传递给ActiveModel序列化程序而没有任何运气。
我的(浓缩)控制器:
class V1::WatchlistsController < ApplicationController
def index
currency = params[:currency]
@watchlists = Watchlist.belongs_to_user(current_user)
render json: @watchlists, each_serializer: WatchlistOnlySerializer
end
我的序列化器:
class V1::WatchlistOnlySerializer < ActiveModel::Serializer
attributes :id, :name, :created_at, :market_value
attributes :id
def filter(keys)
keys = {} if object.active == false
keys
end
private
def market_value
# this is where I'm trying to pass the parameter
currency = "usd"
Balance.watchlist_market_value(self.id, currency)
end
我正在尝试将参数currency
从控制器传递到序列化器,以便在market_value
方法中使用(在示例中将其硬编码为&#34; usd&#34;
我已经尝试了@options和@instance_options,但似乎无法让它发挥作用。不确定它只是一个语法问题。
答案 0 :(得分:4)
AMS版本:0.10.6
传递给render
但未为adapter
保留的任何选项在序列化程序中均可用作instance_options
。
在您的控制器中:
def index
@watchlists = Watchlist.belongs_to_user(current_user)
render json: @watchlists, each_serializer: WatchlistOnlySerializer, currency: params[:currency]
end
然后您可以在序列化程序中访问它,如下所示:
def market_value
# this is where I'm trying to pass the parameter
Balance.watchlist_market_value(self.id, instance_options[:currency])
end
Doc:Passing Arbitrary Options To A Serializer
AMS版本:0.9.7
不幸的是,对于这个版本的AMS,没有明确的方法将参数发送到序列化器。但您可以使用as Jagdeep said中的:scope
(following accessors)或:context
之类的任何关键字来解决此问题:
attr_accessor :object, :scope, :root, :meta_key, :meta, :key_format, :context, :polymorphic
虽然我希望:context
超过:scope
以达到这个问题的目的:
在您的控制器中:
def index
@watchlists = Watchlist.belongs_to_user(current_user)
render json: @watchlists,
each_serializer: WatchlistOnlySerializer,
context: { currency: params[:currency] }
end
然后您可以在序列化程序中访问它,如下所示:
def market_value
# this is where I'm trying to pass the parameter
Balance.watchlist_market_value(self.id, context[:currency])
end
答案 1 :(得分:2)
尝试在控制器中使用scope
:
def index
@watchlists = Watchlist.belongs_to_user(current_user)
render json: @watchlists, each_serializer: WatchlistOnlySerializer, scope: { currency: params[:currency] }
end
在你的序列化器中:
def market_value
Balance.watchlist_market_value(self.id, scope[:currency])
end
答案 2 :(得分:0)
您可以将params发送到您的序列化工具
render json: @watchlists, each_serializer: WatchlistOnlySerializer, current_params: currency
在您的序列化程序中,您可以使用它来获取值
serialization_options[:current_params]