很抱歉,如果我的问题很愚蠢,但我花了很多时间搜索解决方案而且我找不到。
我想创建一个没有数据库的ApiOutputsHandler
模型。所以我创建了一个ActiveModel。
此模型将用于我的API的自定义响应,例如错误(但不仅仅是)。我已经使用send()方法将属性添加到此模型中,但认为它非常糟糕......
class ApiOutputsHandler
attr_accessor :status, :type, :message, :api_code, :http_code, :template
ERR_TYPES = {
:permanent_quota_limit => { :type => 'PermanentLimitException', :message => 'Quota limit reached for this action', :api_code => 700, :http_code => 401 }
}
def initialize(data)
data.each do |name, value|
send("#{name}=", value)
end
end
def error()
send('status=','error')
send('template=','api/v1/api_outputs_handler/output')
return self
end
def new
return self
end
end
然后,我像这样实例化我的对象
@output = ApiOutputsHandler.new(ApiOutputsHandler::ERR_TYPES[:permanent_quota_limit])
return @output.error()
我会很多ERR_TYPES
(这是感兴趣的)。
你认为有更好的方法吗?
当我检查创建的对象时,它会像这样:
#<ApiOutputsHandler:0x000000036a6cd0 @type="PermanentLimitException", @message="Quota limit reached for this action">
你是否在属性面前看到了arobase?为什么我得到它而不是共同点:
#<ApiOutputsHandler:0x000000036a6cd0 type: "PermanentLimitException", message: "Quota limit reached for this action">
感谢您的帮助!
答案 0 :(得分:2)
是的,有更好的方法可以做到这一点。以下是我将如何处理它:
class ApiOutputsHandler
attr_accessor :status, :type, :message, :api_code, :http_code, :template
ERR_TYPES = {
:permanent_quota_limit => { :type => 'PermanentLimitException', :message => 'Quota limit reached for this action', :api_code => 700, :http_code => 401 }
}
def initialize(data)
# added it here so that you can pass symbol error code to initializer
data = ERR_TYPES[data] if data.is_a?(Symbol)
data.each do |name, value|
send("#{name}=", value)
end
end
def error
self.status = 'error'
self.template= 'api/v1/api_outputs_handler/output'
self
end
end
这样,您只需将符号错误代码传递给初始化程序,如下所示:
handler = ApiOutputsHandler.new(:permanent_quota_limit)
您还可以更改对象在控制台中的外观,只需重新定义#inspect
方法即可。在您的情况下,它可能如下所示:
def inspect
"#<#{self.class.name} type: #{type}, message: #{message}>" # etc
end