Wes*_*ger 4 ruby activerecord ruby-on-rails
我已经完成了一些在模型中使用 @ 属性变量(已经是 attr_accessible)的 Rails 应用程序。我有一个艰难的时间让这个但从信息我收集name和@name有同样的事情在一个模型,但IM在这个可能不正确。
这些@ 变量是如何工作的,为什么要使用@ 符号变量?
要添加到当前的答案中,@instance_variables来自面向对象的编程......
在
object-oriented programming类中, aninstance variable是在类中定义的变量(即成员变量),类的每个实例化对象都有一个单独的副本或实例。
“正常”编程有变量的数据片段- strings,integers等等,这些都是独立和只能互动,其他的部分功能,这取决于它们的范围。
面向对象编程 (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)
| 归档时间: |
|
| 查看次数: |
5767 次 |
| 最近记录: |