代码之家  ›  专栏  ›  技术社区  ›  Weston Ganger

Rails模型中@变量的解释

  •  5
  • Weston Ganger  · 技术社区  · 8 年前

    我研究了一些Rails应用程序,这些应用程序在模型中使用@attribute变量(已经是attr_accessible)。我很难得到这方面的信息,但从我收集到的信息来看 name @name 在模型中是一样的,但我可能不正确。

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

    6 回复  |  直到 8 年前
        1
  •  7
  •   Ben    2 年前

    为了添加到当前答案, @instance_variables 来自 object oriented programming ...

    在里面 object-oriented programming 对于类 instance 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
    

    Ruby/Rails是面向对象的;它通过提供一系列 物体 加载&与交互。最显著的例子是 game programming :

    enter image description here

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

    实例 将对象保存在内存中,允许您对类本身执行操作。为此,您可以存储 例子 变量中的类,允许您与变量本身交互:

    @product = Product.new
    @product.save
    

    --

    例子 变量仅在 上下文 class :

    # app/controllers/products_controller.rb
    class ProductsController < ApplicationController
      def show
        @product = Product.new #-> @product only available within ProductsController
      end
    end
    

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

    Request > Rack > Routes > ProductsController.new(request).show > Response
    

    如果你想 @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
    

    最常用的 @实例变量 存储/操作以实例为中心的数据。一个很好的例子 产品 示例)可以是 stock 级别:

    #app/models/product.rb
    class Product < ActiveRecord::Base
      def stock
         @qty / @orders
      end
    end
    

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

    @product = Product.find x
    @product.stock #-> outputs stock value for that product
    
        2
  •  3
  •   Kayvon Ranjbar    8 年前

    名称前面的“@”表示它是模型类的实例变量,与简单的ruby变量名称不同。实例(@)变量可以在前端(视图)中使用。

    例如,您可以实例化一个变量@book,它是book类(即模型)的特定实例。因此,当您使用@book时,您指的是您创建的特定书籍,而不是整个类。

    您可以对实例变量和类变量调用的方法也有区别。


        3
  •  2
  •   Sagar Pandya    8 年前

    以@开头的变量是 实例变量 简而言之,它们允许同一类的其他方法使用它们。例如

    class Something
      def a_method(name)
        @i_variable = name
        normal_variable = "hey"
      end
    
      def another_method
        @i_variable.reverse #can be seen here and used
        normal_variable  #cannot be seen here and cannot be used, throws an error
      end
    end
    

    在Rails中,我认为实例变量很重要,因为它们在应用程序的模型、视图和控制器部分中都是可见的。

        4
  •  2
  •   Sara Fuerst    8 年前

    以开头的变量 @ 是实例变量。这意味着属于类的实例。所以如果我有以下课程:

    class Dog 
        def initialize(name, breed)
            @name = name
            @breed = breed
        end 
    end 
    

    每次我创建 Dog ,我需要给它一个名字和一个品种。

    fido = Dog.new("Fido", "Dalmation")
    

    因为我从 name breed 我可以从 fido .

    fido.name => "Fido"
    
    fido.breed => "Dalmation" 
    
        5
  •  1
  •   Kimmo Lehto    8 年前

    如果您这样做:

    def foo
      thing = "value"
    end
    
    foo
    puts thing
    

    你会得到

    NameError: undefined local variable or method `thing' for main:Object
    

    如果您这样做:

    def foo
      @thing = "value"
    end
    
    foo
    puts @thing
    

    你会得到“价值”

    您可以看到,@variables对您正在操作的整个类都是可见的,在本例中是模型。

    @variables在控制器中也经常使用,如下所示:

    def hello
      @current_user_name = User.find(params[:user_id]).name
    end
    # and in the view:
    Hello, <%= @current_user_name %>
    

    因为如果您没有使用@,您将创建一个局部变量,而视图无法访问该变量。

        6
  •  0
  •   Incerteza    8 年前

    带有@的变量是实例私有变量。没有@的var是本地方法变量。

    如果对象有一个返回值或设置值为attr_accessor、attr_reader或def的方法,则可以在对象级别访问带有@的变量。