因此,根据这个问题的逻辑:Instance variables through methods
rails是构建在Ruby上的框架,所以我假设上述问题中的情况也会传播到rails?因此,如果我有控制器的帖子和方法,比如:
def index
@posts = Post.all
end实例变量@post是否适用于控制器中在索引操作之后调用的所有操作?但是如果im正确的话,对服务器的每一个请求--控制器的新实例--都会再次实例化,而旧的实例是垃圾收集的,所以我不需要观察实例变量的“周期性”覆盖吗?
因此,在这种情况下,如果我们不是在讨论会话,我可以说rails中的实例变量具有“方法-函数范围”(技术上不正确,因为这不是真的,但看起来是那样的)?
编辑1。@Sparda当我说“方法-作用域”时,我的意思是:我的控制器名为Demo,里面有两个动作,名为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并创建@posts_1,然后默认情况下呈现视图并完成请求。因此,控制器实例(和所有实例变量)都是垃圾收集的。在这个场景中, action_2从未被调用,因此@posts_2从未创建。(当然,@posts_2在action_1中不可用)。演示/action_2也是如此,@posts_1从未创建过。
现在,对于演示/ action_1,我想在action_1中调用action_2,然后调用@posts_1,然后创建@posts_2,现在@posts_1在action_2中可用?如果这是正确的,那么如果我用相同的名称命名这个变量(@posts_1和@posts_2),那么action_2中的这个变量当然会覆盖action_1中的变量。
因此,当我说“方法-作用域”时,我再次说它不是真的--我的意思是,如果我要演示/操作1._1,那么我就不能使用来自其他操作的实例变量(action_2,action_3,…,action_N),因为它是频繁地创建和破坏每个请求的控制器对象的本质。
我对这一切都不熟悉,所以不要大喊大叫。
发布于 2013-10-22 21:04:32
首先,是的,实例变量可以在不同的对象方法中更改,但是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的新实例
https://stackoverflow.com/questions/19526205
复制相似问题