0

所以从这个问题的逻辑: Instance variables through methods

Ruby on rails 是基于 Ruby 构建的框架,所以我假设上述问题的情况也会传播到 rails?因此,如果我有控制器帖子和方法,例如:

def index
    @posts = Post.all
end

实例变量@posts 可用于在索引操作后调用的控制器中的所有操作?但是,如果我做对了,每次对服务器的请求都会再次实例化控制器的新实例,并且旧的实例会被垃圾收集,所以我不需要关注实例变量的这种“循环”覆盖?

所以在那种情况下,如果我们不谈论会话,我可以说 rails 中的实例变量具有“方法函数范围”(这在技术上是不正确的说法,因为它不是真的,但看起来像那样)?

编辑 1。@Sparda当我说“方法范围”时,我的意思是:我有名为 Demo 的控制器和内部的 2 个动作,名为action_1action_2

Controller Demo
    def action_1
        @posts_1 = Post.all
    end

    def action_2
        @posts_2 = Post.where(#some_condition)
    end
 end

所以对于 demo/action_1 的第一个请求,控制器被实例化,然后 action_1 被调用并且@posts_1 被创建,然后默认视图被渲染并且请求被完成。因此控制器的实例(和所有实例变量)被垃圾收集。在这种情况下,action_2 永远不会被调用,所以@posts_2 永远不会被创建。(当然@posts_2 在 action_1 中不可用)。demo/action_2 也是如此,@posts_1 从未创建。

现在对于 demo/action_1,在 action_1 内部我想调用 action_2,然后创建 @posts_1,然后创建 @posts_2,现在 @posts_1 在 action_2 中可用?如果这是正确的,如果我用相同的名称命名这个变量(@posts_1 和@posts_2),那么来自 action_2 的这个当然会覆盖来自 action_1 的变量。

所以当我说“方法范围”时,我再次说这不是真的,我的意思是每个请求频繁创建和销毁控制器对象的这种性质,我不能使用来自其他动作的实例变量(action_2,action_3, ..., action_N) 如果我要演示/action_1。

我对这一切都很陌生,所以不要大喊大叫:D

4

1 回答 1

2

首先,是的,实例变量可以在对象的不同方法中更改,但是 ruby​​ 会传播您在类中使用 setter 和 getter。所以你实际上从来没有手动设置它。

class Post 
  attr_accessor :message
end

等于

class Post

  def initialize
    @message
  end

  def message
    @message
  end

  def message=(m)
    @message = m
  end
end

所以当你这样做的时候

p = Post.new
p.message = "Hello" #=> that will call "message=" method
p.message           #=> that will call "message" method

其次,Rails 实例变量的行为方式完全相同。您经常在模型中使用它们。

最后一件事。实际上,您从不自己调用控制器,Rails 会为您做到这一点。如果你查看 routes.rb 文件,你会发现一些这样的路由:

get "posts", to: "posts#index"

这会做PostsController.action(:index)。因此,每当您调用“/posts”时,您都会获得 PostsController 的新实例

于 2013-10-22T21:04:32.997 回答