3

这是我正在使用的结构:

应用程序/模型/model.rb

class Model < ActiveRecord::Base
    attr_accessor :some_var
end

应用程序/模型/model_controller.rb

class ModelsController < ApplicationController
    def show
        @model = Model.find(params[:id])
        @other_var
        if @model.some_var.nil?
            @model.some_var = "some value"
            @other_var = "some value"
        else
            @other_var = @model.some_var
        end
    end
end

每当我运行这段代码(例如 show 方法)时,if 子句被评估为真(例如 @model.some_var == nil)。我该如何解决这个问题?我对 attr_accessor 如何工作的假设有问题吗?

4

1 回答 1

12

attr_accessor是一个内置的 Ruby 宏,它将为对象的实例变量定义一个 setter 和一个 getter,并且与具有 ActiveRecord 实例的数据库列没有任何关系。例如:

class Animal
  attr_accessor :legs
end

a = Animal.new
a.legs = 4
a.legs #=> 4

如果要将其保存到数据库中,则需要在迁移中定义一列。然后 ActiveRecord 将自动创建访问器方法,您可以(应该)删除您的attr_accessor声明。

于 2012-10-15T22:54:09.973 回答