Rails控制器和"受保护"涉及继承的变量

时间:2012-07-13 16:18:30

标签: ruby ruby-on-rails-3 scope

我想在我的application_controller.rb控制器中声明一个变量,该变量可供从中继承的所有控制器访问。如果可能的话,我希望变量只能在子类中访问,而不是其他任何地方,包括视图(除非特别传递到视图中)。

我是Ruby和Rails的新手,并且我不确定变量是否存在“受保护”范围,我已经看到它对函数有效。我一直无法找到一个简单的答案,我已经在我的应用程序中尝试了一些不同的方法来声明变量以及可以访问它们的位置。这让我没有了解如何实现这一目标。

非常感谢任何帮助。

代码:

class ApplicationController < ActionController::Base
    protect_from_forgery
    @admin_name = "AdminUserName"
    @admin_password = "AdminPassword"
end

class ProjectsController < ApplicationController
    http_basic_authenticate_with :name => @admin_name, :password => @admin_password, :except => [:index, :show]

    # controller functions here
end

这似乎对我不起作用。

1 个答案:

答案 0 :(得分:1)

正如您已经认识到的那样,ruby中的变量不存在类似受保护范围的内容。您可以在Rails中使用instance variable在视图可访问的控制器中设置变量。这是一个旧的Rails功能you can use instance variables set in the controller in the views

实例变量从实例继承到实例

class A
  def make_ivar
    @foo = 'bar'
  end
end

class B < A
  def get_ivar
    @foo
  end
end

b = B.new
b.make_ivar
b.get_ivar #=> @foo

但请注意,通过将实例变量传递给视图rails is breaking encapsulation并将其用于所有部分may not be good practice。最重要的是,replace instance variables with local variables as soon as they land in the views

<强>更新

在您的情况下,请使用constants。常量属于它们已定义的类的范围并被继承,但除非使用范围调用,否则它们不可用于视图

class ApplicationController < ActionController::Base
  protect_from_forgery
  ADMIN_NAME = "AdminUserName"
  ADMIN_PW = "AdminPassword"
end

class ProjectsController < ApplicationController
  http_basic_authenticate_with :name => ADMIN_NAME, :password => ADMIN_PW, :except => [:index, :show]

  # controller functions here
end

我猜你不想在视图中调用它们。如果你真的想这样做,你可以这样做:

ApplicationController::ADMIN_NAME