繁体   English   中英

ActiveModel Serializer - 将params传递给序列化程序

[英]ActiveModel Serializer - Passing params to serializers

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方法中使用(在该示例中,硬编码为“usd”)。

我试过@options和@instance_options但我似乎无法让它工作。 不确定它只是一个语法问题。

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:将任意选项传递给序列化程序


AMS版本:0.9.7

不幸的是,对于这个版本的AMS,没有明确的方法将参数发送到串行器。 但你可以使用任何关键字来破解它:scope如Jagdeep所说 )或:context 以下访问者中的 :context

attr_accessor :object, :scope, :root, :meta_key, :meta, :key_format, :context, :polymorphic

虽然我更喜欢:context :scope这个问题的目的: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

尝试在控制器中使用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

你可以将你的参数发送到这样的序列化器

render json: @watchlists, each_serializer: WatchlistOnlySerializer, current_params: currency

在您的序列化程序中,您可以使用它来获取值

serialization_options[:current_params]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM