【问题标题】:Instance variables through methods in Ruby on rails通过 Ruby on rails 中的方法实例变量
【发布时间】:2013-10-22 19:04:44
【问题描述】:

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

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

def index
    @posts = Post.all
end

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

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

编辑 1。 @斯巴达 当我说“方法范围”时,我的意思是: 我有一个名为 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 被调用并且@posts_1 被创建,然后默认视图被渲染并且请求被完成。因此控制器的实例(和所有实例变量)被垃圾收集。在这个scenario中,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 的 this 将覆盖来自 action_1 的变量。

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

我是新手,所以不要大喊大叫:D

【问题讨论】:

  • 1.True 2.True 3.Expand...
  • 对于您的问题一,实例变量@posts 仅在该请求期间可用于控制器中的所有方法。
  • 关于最后一条语句,从某种意义上说,Rails 通常会实例化一个新控制器,然后根据请求的路由仅对其调用一个操作,但它是将其称为“方法范围”是不正确的,因为它不是,本地变量具有方法范围。

标签: ruby-on-rails


【解决方案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 的新实例

【讨论】:

    猜你喜欢
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-09
    • 2010-10-31
    • 2013-07-08
    • 1970-01-01
    相关资源
    最近更新 更多