在Rails中如何将变量从控制器传递到序列化器?

4

我在控制器中有以下代码,用于获取一个位置到另一个位置之间的距离(以米为单位):

range = Geocoder::Calculations.distance_between([lat,lng],[Model.location.lat,Model.location.lng])
rangeInMeters = range * 1000            
rangeRounded = rangeInMeters.round
rangeRounded = rangeRounded / 100 * 100

我在序列化器中添加了以下代码,以使JSON响应的输出更加友好:

class ModelSerializer < ActiveModel::Serializer
  attributes :id, :name, :address, :range

  def range
  // something
  end
end

如何使rangeRounded被ModelSerializer读取,以便在json响应中显示为以下形式:
{
        "id": 1,
        "name": "Name A",
        "address": "Address A",
        "range": 500
    },

这个答案应该会有所帮助:https://dev59.com/MmAg5IYBdhLWcg3wpMWz#37956952 - Abhinay
我已经尝试过了,但它不起作用,不知道哪里出了问题。 - rony
你能展示一些例子吗?你是如何尝试传递它的? - Abhinay
确定, `属性:id、name、address、range

has_many :locations

def range puts @instance_options[:rangeRounded] end`
- rony
1个回答

3
如果我理解正确,您的模型具有 location,其中包含 latlng。您想在序列化程序方法中访问这些字段。
您可以使用 object. 访问这些字段。
参考 RailsCasts - Active Model Serializers episode
#controller
def action
    ...
    range = Geocoder::Calculations.distance_between([lat,lng],[Model.location.lat,Model.location.lng])
    range_in_meters = range * 1000            
    range_rounded = range_in_meters.round
    range_rounded = range_rounded / 100 * 100
    ...

    render json: @model, serializer: ModelSerializer, range_rounded: range_rounded
end


#serializer
class ModelSerializer < ActiveModel::Serializer
    attributes :id, :name, :address, :range
    #point assosiations here (same as in model)

    def range
        puts @instance_options[:range_rounded]
    end
end

请您能否详细说明一下?我还在学习这个序列化器。非常感谢。 - rony
请在您希望使用序列化“model”响应的控制器代码中提供该代码和模型。 - Mikhail Katrin
上面的帖子中需要序列化的变量是 rangeRounded - rony
出现了同样的问题,就像我之前遇到的一样,先生:未定义本地变量或方法rangeRounded。 - rony
做了一些更改,请再试一次。 - Mikhail Katrin
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接