代码之家  ›  专栏  ›  技术社区  ›  Honza

定义Ruby和Rails中的方法

  •  27
  • Honza  · 技术社区  · 17 年前

    我有一个非常古老的模板系统写在ERB之上。它依赖于数据库中存储的ERB模板。它们被读取和呈现。当我想将数据从一个模板传递到另一个模板时,我使用:locals参数到Rails render方法。对于在某些模板中设置这些变量的默认变量,我使用定义的?方法,它简单地告诉我是否定义了局部变量,如果未定义,则使用如下默认值初始化它:

    unless defined?(perex)
      perex = true
    end
    

    我有两个问题: 除了使用defined,还有其他更好的方法吗?哪个被证明是不可靠的(在TopRails 1.6上可靠了好几年)?这样的方式不应该导致我重写所有的模板。 我一直在浏览Ruby文档,但找不到关于defined的任何信息?方法是它被弃用了还是我只是瞎了眼?

    实际问题是由一个Ruby/eRB bug引起的。有时 除非 佩雷斯 对世界其他地方仍然是零。删除定义?决定。

    4 回复  |  直到 17 年前
        1
  •  39
  •   Simone    12 年前

    defined? is an operator

    第二:如果我正确理解了你的问题,那么解决方法就是使用以下Ruby习惯用法:

    perex ||= true
    

    perex 如果它是未定义的或 nil . 这并不完全是你的例子所做的,因为你的例子在赋值为 ,但如果您依赖于它,那么,在我看来,在没有看到它的情况下,您就没有编写清晰的代码。

    编辑 :如Honza所述,上述声明将取代 false . 然后,我建议重写最小行数:

    perex ||= perex.nil?  # Assign true only when perex is undefined or nil
    
        2
  •  25
  •   mislav Telemachus    17 年前

    如果在Rails模板中定义了local,最安全的测试方法是:

    local_assigns[:perex]
    

    Rails API中记录了这一点,并解释了 defined?

        3
  •  12
  •   KenB    16 年前

    根据mislav的回答,我在Rails API中查找了该文档,并在 Class ActionView::Base

    if local_assigns.has_key? :perex
    
        4
  •  6
  •   Community Mohan Dere    9 年前

    考虑到 mislav's original answer KenB's elaboration Hash#fetch 方法,以便在原始哈希中不存在密钥时回退到备用值。

    perex = local_assigns.fetch(:perex, true)
    

    这甚至比 ||= 方法,因为有时您希望允许 false 从不 允许 错误的

    perex = local_assigns[:perex] || true