Rails吸气装饰

时间:2011-05-22 18:46:06

标签: ruby-on-rails getter

我有一个从模型

访问属性的视图

。<%= @ checklist.alt_escape_indicated%>

。<%= @ checklist.sign_condition%>

其中一些将是我想要显示为“是”或“否”的布尔值。我在我的模型类中编写了一些代码来执行此操作:

def getter_decorator(attr)
  var = read_attribute(attr)
  if !!var == var
    boolean_as_string(var)
  else
    var
  end
end

def boolean_as_string(bool_type)
    if bool_type
      "Yes"
    else
      "No"
    end
end

所以我可以这样做:   。<%= @ checklist.boolean_as_string(@ checklist.sign_condition)%>

我所知道的属性是boolean或getter_decorator。我的问题是。有没有办法可以装饰我的所有getter,所以当我这样做时会调用这个函数   @ checklist.sign_condition

4 个答案:

答案 0 :(得分:1)

为什么不覆盖getter或创建一个新的?

def sign_condition
  self.sign_condition == true ? "Yes" : "No"
end

如果这导致冲突(你必须测试并看到),只需用略有不同的名字做同样的事情......

def sign_state
  self.sign_condition == true ? "Yes" : "No"
end

答案 1 :(得分:1)

def getter_decorator(attr)
  var = read_attribute(attr)
  var == true ? "Yes" : var == false ? "No" : var
end

答案 2 :(得分:1)

我建议将它作为辅助方法,因为它仅用于演示。当您的网站在国际上起飞时,这也将使其更容易本地化...

def yn(val)
  val ? "Yes" : "No"
  # localized: I18n.t (val ? "Yes" : "No")
end

然后在您的视图中使用它:

<%= yn @checklist.sign_condition %>

但是,如果您真的希望bool自动显示为是/否,您可以执行以下操作:

class TrueClass
  def to_s
    self ? "Yes" : "No"
  end
end

puts true #-> Yes

但我不建议这样做;)

答案 3 :(得分:0)

class Checklist
  %w(alt_escape_indicated sign_condition other_getters).each do |method|
    eval "def #{method}; super ? 'Yes' : 'No'; end"
  end
end