首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ActiveModel动态属性

ActiveModel动态属性
EN

Stack Overflow用户
提问于 2013-05-16 01:27:35
回答 1查看 1.4K关注 0票数 0

如果我的问题很愚蠢,很抱歉,我花了很多时间寻找解决方案,但我没有找到。

我想创建一个没有数据库的ApiOutputsHandler模型。所以我创建了一个ActiveModel。此模型将用于我的API的自定义响应,如错误(但不仅仅是)。我已经使用send()方法将属性添加到这个模型中,但我认为它非常糟糕……

代码语言:javascript
复制
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

然后,我像这样实例化我的对象

代码语言:javascript
复制
@output = ApiOutputsHandler.new(ApiOutputsHandler::ERR_TYPES[:permanent_quota_limit]) 
return @output.error()

我会节省很多ERR_TYPES (这就是我的兴趣所在)。你觉得有没有更好的方法呢?

当我检查创建的对象时,它看起来像这样:

代码语言:javascript
复制
#<ApiOutputsHandler:0x000000036a6cd0 @type="PermanentLimitException", @message="Quota limit reached for this action">

你看到属性前面的arobase了吗?为什么我得到的是它而不是普通的:

代码语言:javascript
复制
#<ApiOutputsHandler:0x000000036a6cd0 type: "PermanentLimitException", message: "Quota limit reached for this action">

谢谢你的帮忙!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-05-16 03:58:50

是的,有一种更好的方法。下面是我的做法:

代码语言:javascript
复制
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

这样,您就可以将符号错误代码传递给初始化器,如下所示:

代码语言:javascript
复制
handler = ApiOutputsHandler.new(:permanent_quota_limit)

您还可以在控制台中更改对象的外观,只需重新定义#inspect方法即可。在您的示例中,它可能如下所示:

代码语言:javascript
复制
def inspect
  "#<#{self.class.name} type: #{type}, message: #{message}>" # etc
end
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16571392

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档