rails模型中未​​定义的方法self.id.

Omn*_*ent 1 ruby-on-rails

我有一个简单的Customer模型,它有id,firstName,lastName,address_id列.

在方法中,我有以下方法将数据添加到数据库:

  def self.add_customer(firstname, lastname)
    @cust = Customer.new(:firstName => firstname, :lastName => lastname, :address_id => self.id)
    @cust.save
  end
Run Code Online (Sandbox Code Playgroud)

这给了我错误

undefined method `id'
Run Code Online (Sandbox Code Playgroud)

我正在使用rails 2.3.5我看过这个代码在很多书中都有用.我的客户表有一个ID列.我已在实际DB中验证过.

MBO*_*MBO 6

self.add_customer是类方法,而不是实例方法,并且id只有实例中的方法.

编辑:
假设你有:

class Customer < ActiveRecord::Base
  belongs_to :address
end

Class Address < ActiveRecord::Base
  has_many :customers
end
Run Code Online (Sandbox Code Playgroud)

然后你可以:

@address.customers.create(:first_name => first_name, :last_name => last_name)
Run Code Online (Sandbox Code Playgroud)

它会自动将新客户与@address.

或者,您可以从方法定义中删除self

def add_customer(firstname, lastname)
  @cust = Customer.new(:firstName => firstname, :lastName => lastname, :address_id => self.id)
  @cust.save
end
Run Code Online (Sandbox Code Playgroud)

should just work. It works because if you declare add_customer as instance method (without self or class name like Address.add_customer) then it has access to self.id

  • @omnipresent以`self`为前缀的方法是类方法(如C++/C#/ Java中的静态方法).你可以只使用类名称来调用它们,因此`Customer.add_customer`可以与`def self.add_customer`一起使用.没有`self`的方法是实例方法(来自C++/C#/ Java的非静态方法),所以你需要那种类型的对象`@customer = Customer.new`(或`build`,或`create`),然后你可以调用`@ customer.id`. (2认同)