我有一个相当老旧的系统模板编写上的局.它依赖于雇员再培训局的模板存储在数据库。这些都是阅读和呈现。当我想要将数据从一个模板的另一个我用的是:当地人的参数轨道呈现的方法。为默认设置变量的这些变量在一些模板,我使用的定义?方法,简单地告诉我,如果地方变量的定义和如果不是我的初始化与默认值是这样的:

unless defined?(perex)
  perex = true
end

我升级的应用程序,以最新的轨道,我看到一些奇怪的行为。基本上,这有时工作(有时perex未定义)和有时不(perex定义和设置无)。发生这种情况没有什么变化。

我有两个问题:有没有更好的办法比使用定义的?其证明是不可靠的(是可靠的数年上轨1.6)?这样一种方式不应导致我改写了所有的模板。我已经通过红宝石文件和未能找到任何有关定义的?法。是废弃的或者我只是普通的盲目?

编辑: 实际问题是由什么似乎是一个红宝石/雇员再培训局的错误。有的时候 除非 发言会的工作,但有时不是。奇怪的是,即使第二线得到了执行 perex 仍然留nil到世界其他地区。删除定义?解决。

有帮助吗?

解决方案

第一:实际上, defined? 是一个操作员.

第二:如果我理解你的问题是否正确,这一方法就是与这红宝石成语:

perex ||= true

这将分配到真实的 perex 如果它是不确定的或 nil.这不正是你的例会,因为你没评估的指派当值 nil, 但如果你依靠,那么,在我看来,没有看到它,你不是在写明确的代码。

编辑:如洪扎注意到,上述声明将取代的价值 perex 当它是 false.然后,我提出以下建议改写的最低数量的线:

perex ||= perex.nil?  # Assign true only when perex is undefined or nil

其他提示

最安全的方式的测试,如果一个地方的定义是在一个轨道的模板是:

local_assigns[:perex]

这是记录在轨API同的解释, defined? 不能使用,因为实行限制。

每mislav的答案,我去寻找那个文件在轨API,并发现它 类ActionView::基 (在标题"通过地方变量子模板")。这是不值得的搜索,但是,由于它几乎没有说任何事情比mislav没有。但它建议这种模式:

if local_assigns.has_key? :perex

考虑到considerationg mislav的原答案KenB的拟订, 我认为下面是绝对的最佳做法(虽然我开到的意见).它利用了红宝石的 哈希#fetch 法退回上一个备用的价值,如果关键不存在的原散列。

perex = local_assigns.fetch(:perex, true)

这是甚至比 ||= 方法,大多数用户会的建议,因为有时候你会想让 false 值。例如,以下代码 从来没有 允许 false 值是通过:

perex = local_assigns[:perex] || true
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top