Rails 模型中 @ 变量的解释

Wes*_*ger 4 ruby activerecord ruby-on-rails

我已经完成了一些在模型中使用 @ 属性变量(已经是 attr_accessible)的 Rails 应用程序。我有一个艰难的时间让这个但从信息我收集name@name有同样的事情在一个模型,但IM在这个可能不正确。

这些@ 变量是如何工作的,为什么要使用@ 符号变量?

Ric*_*eck 5

要添加到当前的答案中,@instance_variables来自面向对象的编程......

object-oriented programming类中, aninstance variable是在类中定义的变量(即成员变量),类的每个实例化对象都有一个单独的副本或实例


面向对象编程

“正常”编程有变量的数据片段- stringsintegers等等,这些都是独立和只能互动,其他的部分功能,这取决于它们的范围。

面向对象编程 (OOP) 可以将变量视为可编辑的数据片段(称为classes)。这些可以被调用编辑和最重要的交互......

#app/models/product.rb
class Product < ActiveRecord::Base
  #-> class
end

def new
   @product = Product.new #-> creating a new instance of the class
end
Run Code Online (Sandbox Code Playgroud)

Ruby/Rails 是面向对象的;它的工作原理是为您提供一系列要加载和交互的对象。最显着的例子是游戏编程

在此处输入图片说明

面向对象的工作方式是调用/初始化一个类的实例(在我们的例子中Product),允许您操作它。

实例将对象保存在内存中,允许您对类本身执行操作。为此,您需要将类的实例存储在一个变量中,从而允许您与变量本身进行交互:

@product = Product.new
@product.save
Run Code Online (Sandbox Code Playgroud)

——

实例变量仅在以下上下文中class有效:

# app/controllers/products_controller.rb
class ProductsController < ApplicationController
  def show
    @product = Product.new #-> @product only available within ProductsController
  end
end
Run Code Online (Sandbox Code Playgroud)

Rails 中的控制器是classes通过机架请求调用的:

Request > Rack > Routes > ProductsController.new(request).show > Response
Run Code Online (Sandbox Code Playgroud)

如果您希望@instance_variable在类的所有方法中都可用,则它必须处于instance级别...

# app/controllers/products_controller.rb
class ProductsController < ApplicationController
  def show
    @product = Product.new
    product_save
  end

  private

  def product_save
    @product.save #-> @product available in instance of ProductsController class
  end
end
Run Code Online (Sandbox Code Playgroud)

最常见的用途@instance_variables是存储/操作以实例为中心的数据。一个很好的例子(对于我们的Product例子)可能是stock级别:

#app/models/product.rb
class Product < ActiveRecord::Base
  def stock
     @qty / @orders
  end
end
Run Code Online (Sandbox Code Playgroud)

因为您可以在 Ruby 中使用getter/setter方法,所以您可以定义类的实例值,通过其他实例数据访问它们:

@product = Product.find x
@product.stock #-> outputs stock value for that product
Run Code Online (Sandbox Code Playgroud)