我可以在Ruby中这样做吗?

时间:2011-03-24 04:28:25

标签: ruby-on-rails activerecord

目前我有以下两行代码

errors.add_to_base I18n.t :error_message if value != 1
return false if !errors.blank?

是否可以将其浓缩为一行代码?我需要在具有不同错误消息和条件的多个地方执行此操作。此外,“return false”是停止ActiveRecord生命周期的流程。

2 个答案:

答案 0 :(得分:1)

嗯。如果您知道errors.blank?将为真,除非第一个条件触发:

(errors.add_to_base I18n.t :error_message; return) if value != 1

更新: 啊哈,您愿意定义一种方法。 Proc对象怎么样?它比这里的方法更好,如果Proc块返回,那么调用将从周围的方法返回。

test = Proc.new do |cond, msg|
  errors.add_to_base I18n.t msg if cond
  return unless errors.blank?
end
# ...
test.call value != 1, :error_message

请注意,您不需要return false,因为普通return将返回nil,这将足够好,除非一些虐待狂正在做{{1}之类的事情}}。 :-)

答案 1 :(得分:1)

您可以利用布尔逻辑运算符的工作方式并执行以下操作:

value != 1 && errors.add_to_base I18n.t :error_message && return false

不太清楚,我不建议使用它。此外,如果errors.add_to_base返回的内容为“falseish”,则返回false将不会发生。

请记住:“总是编码,好像维护你的代码的人是一个知道你住在哪里的暴力精神病患者”