所以从这个问题的逻辑: Instance variables through methods
Ruby on rails是基于Ruby构建的框架,所以我假设从上面的问题传播到rails也是如此?所以,如果我有控制器帖子和方法,如:
def index
@posts = Post.all
end
实例变量@posts可用于索引操作后调用的控制器中的所有操作?但是,如果我得到这个权利,每个请求到服务器的控制器的新实例再次实例化,旧的实例是垃圾收集所以我不需要观察这个“循环”覆盖实例变量?
所以在这种情况下,如果我们不讨论会话,我可以说rails中的实例变量具有“方法功能范围”(技术说法不对,因为它不是真的,但似乎是这样) ?
编辑1 。 @Sparda
当我说“方法范围”时,我的意思是:
我有一个名为Demo的控制器和2个动作,名为 action_1 和 action_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并创建@posst_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
答案 0 :(得分:1)
首先,是的,实例变量可以在不同的对象方法中更改,但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的新实例