我正在使用Rails 4.2
我有两个都需要存在或都不存在的数据库调用,因此我在方法内部使用事务来做到这一点。我还希望通过相同方法在其他位置访问我创建的变量。我是否只需要使用实例变量而不是局部变量? (为此,我使用puts
作为其他代码的示例,计划执行的代码比这复杂得多。)
def method_name
ActiveRecord::Base.transaction do
record = another_method(1)
another_method(record)
end
puts record.id
end
如果我运行了这段代码,它会抛出:
undefined local variable or method `record' for #<Class:...>
,但是将record
更改为@record
可以缓解这种情况。那真的是最好的选择吗?还是有更好/更优雅的方式?
答案 0 :(得分:4)
在方法范围内声明record
:
def method_name
record = nil # ⇐ THIS
ActiveRecord::Base.transaction do
record = another_method(1)
end
puts record.id #⇒ ID or NoMethodError if `another_method` did not succeed
end
通常来说,这种方法是一种代码味道,在大多数现代语言中都是禁止的(内部record
将被关闭,而外部则保持不变。)正确的方法可能是使transaction
返回值并将其分配给记录:
def method_name
record, another_record =
ActiveRecord::Base.transaction do
[another_method(1), another_method(2)]
end
puts record.id if record
end