【问题标题】:Simple variable scope in RubyRuby 中的简单变量作用域
【发布时间】:2011-11-22 04:40:37
【问题描述】:

我试图让以下代码工作,但它给了我一个未定义的变量错误:

class PagesController < ApplicationController
  @company = "Acme"
  def home
    @title = "Welcome to #{company}"
  end
  def faq
    @title = "FAQ | #{company}"
  end
end

如何在函数中访问@company?

【问题讨论】:

    标签: ruby-on-rails ruby


    【解决方案1】:

    在 Ruby 中,每个类也是一个对象,您在这里所做的是在类对象 PagesController 上设置一个名为 @company 的实例变量,而不是在 PagesController 的实例上。

    您可能想要的是使用常量而不是实例变量。可能是这样的:

    class PagesController < ApplicationController
      COMPANY = "Acme"
    
      def home
        @title = "Welcome to #{COMPANY}"
      end
    
      def faq
        @title = "FAQ | #{COMPANY}"
      end
    end
    

    如果您希望公司根据您显示的“页面”进行更改,您应该考虑添加一个页面模型,该模型具有保存公司名称的属性或与另一个名为 Company 的模型的关联。

    【讨论】:

      【解决方案2】:

      可以这样直接访问

      class PagesController < ApplicationController
        @@company = "Acme"  # class var
        def home
          @title = "Welcome to #{@@company}"
        end
        def faq
          @title = "FAQ | #{@@company}"
        end
      end
      

      或者像这样定义一个自定义的getter方法

      class PagesController < ApplicationController
        @@company = "Acme"
        def home
          @title = "Welcome to #{company}"
        end
        def faq
          @title = "FAQ | #{company}"
        end
        private
        def company
          @@company
        end
      end
      

      或从数据库中获取公司名称

      class PagesController < ApplicationController
        def home
          @title = "Welcome to #{company}"
        end
        def faq
          @title = "FAQ | #{company}"
        end
      
        private
        def company
          @company ||= current_user.company  # get company of logged in user (and "cache" it)
          @company.name
        end
      end
      

      【讨论】:

      • 第一个示例在#(@company) 中没有输出任何内容,第二个示例是一个好习惯吗?
      • 我认为使用 getter 访问类变量比直接访问更好。
      • 我提供了一个更动态的示例,从当前登录的用户中检索公司名称
      • 感谢 macek,动态示例很棒,但对于我的需要,一个简单的常量可能会更好。
      猜你喜欢
      • 2012-03-20
      • 2017-07-21
      • 2011-04-14
      • 1970-01-01
      • 2010-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多