在Rails中,我有一个名为values
的对象,可能是20种ActiveRecord中的一种,只有其中一种有一种方法(可能是错误的术语,rails newbie)可以添加一个定制的返回的JSON对象中的字段method name
是field name
而method returned value
是field value
。例如
class XXXController < ApplicationController
..
if a
values = A
elsif b
values = B
elseif c
values = C
..
end
render :json => values.to_json(:methods => :type_needed)
你会看到像
这样的回应{
..
"type_needed": true,
..
}
我只在A中定义了type_needed,在某些情况下会返回true
。对于其他像B,C,D ......总共19个,我希望他们都将type_needed返回为false
,有没有办法可以在一个地方做到这一点,而不是在其余地方添加type_needed方法19?
答案 0 :(得分:1)
我将按如下方式进行:
json = values.to_json(:methods => :type_needed)
# => "[{\"id\":1,\"name\":\"Aaa\"},{\"id\":\"2\",\"name\":\"Bbb\"}]" # => Representational value only
ary = JSON.parse(json)
# => [{"id"=>1, "name"=>"Aaa"}, {"id"=>2, "name"=>"Bbb"}]
ary.map! { |hash| hash[:type_needed] = false unless hash.key?(:type_needed); hash }
# => [{"id"=>1, "name"=>"Aaa", :type_needed=>false}, {"id"=>2, "name"=>"Bbb", :type_needed=>false}]
ary.to_json
# => "[{\"id\":1,\"name\":\"Aaa\",\"type_needed\":false},{\"id\":\"2\",\"name\":\"Bbb\",\"type_needed\":false}]"
答案 1 :(得分:0)
如果我正确理解您的问题,那么您需要定义一次type_needed
方法,并将其包含在所有20个模型中。如果是,那么您可以定义一个问题并将其包含在所有20个模型中。
应用/模型/关切/ my_model_concern.rb 强>
module MyModelConcern
extend ActiveSupport::Concern
def type_needed?
self.respond_to?(:some_method)
end
end
应用/模型/ a.rb 强>
class A < ApplicationRecord
include MyModelConcern
def some_method
end
end
应用/模型/ b.rb 强>
class B < ApplicationRecord
include MyModelConcern
end
应用/模型/ c.rb 强>
class C < ApplicationRecord
include MyModelConcern
end
用上面的
a = A.new
a.type_needed?
=> true
b = B.new
b.type_needed?
=> false
c = C.new
c.type_needed?
=> false
看看这是否有帮助。