对于#<user:0x007fc955029380> </user:0x007fc955029380>的未定义方法`addresses'

时间:2014-07-10 10:50:24

标签: ruby-on-rails ruby undefined rails-activerecord

我是Ruby和Rails的新手,试图修复我经常遇到的错误。不知道如何解决它。请帮忙..

Route.rb

namespace :my do
    namespace :account do
      resource  :details, :only => [:show, :update]
      resources :addresses
    end
end 

AddressesController

class My::Account::AddressesController < MyController

  def index
    @addresses = current_user.addresses
  end

  def new
    @address = current_user.addresses.new
  end

....

end

错误 - 未定义的方法`地址&#39;

NoMethodError in My::Account::AddressesController#index
undefined method `addresses' for #<User:0x007fc955029380>

客户地址和用户的Schema.rb

  create_table "customer_addresses", force: true do |t|
    t.integer  "customer_id"
    t.string   "name"
    t.string   "line_1"
    t.string   "line_2"
    t.string   "line_3"
    t.string   "line_4"
    t.string   "line_5"
    t.string   "postcode"
    t.string   "phone"
    t.datetime "deleted_at"
    t.datetime "created_at"
    t.datetime "updated_at"
  end

  add_index "customer_addresses", ["customer_id"], name:         "index_customer_addresses_on_customer_id"

  create_table "users", force: true do |t|
    t.string   "first_name"
    t.string   "last_name"
    t.string   "email"
    t.string   "password_digest"
    t.datetime "created_at"
    t.datetime "updated_at"
    t.string   "password_reset_token"
    t.datetime "password_reset_token_at"
  end

  add_index "users", ["email"], name: "index_users_on_email", unique: true

User.rb

class User < ActiveRecord::Base
    validates :email, :presence => true, :uniqueness => true
    has_secure_password
 ...
end 

Customer.rb

class Customer < User

    has_many :addresses

    def self.register(attributes)
        customer = create!(attributes)
        return customer
    end

    def full_name
        "#{first_name} #{last_name}"
    end

end

Address.rb

class Customer::Address < ActiveRecord::Base

  belongs_to :customer 

  self.table_name = 'customer_addresses'

  default_scope { where(:deleted_at => nil) }

  validates :line_1, :postcode, :phone, :presence => true

end

2 个答案:

答案 0 :(得分:3)

您需要在两个模型上定义关系。

class User < ActiveRedord::Base
  has_many :addresses, class_name: 'CustomerAddress', foreign_key: 'customer_id'
end

class Address < ActiveRecord::Base
  belongs_to :user, foreign_key: 'customer_id'
end

答案 1 :(得分:1)

#current_customer添加ApplicationController方法,返回Customer - 实例而不是User - 实例:

class ApplicationController
  #…
  private
  def current_customer
    current_user && Customer.find_by_id(current_user.id)
  end
end

然后改变你的代码:

class My::Account::AddressesController < MyController

  def index
    @addresses = current_customer.addresses
  end

  def new
    @address = current_customer.addresses.new
  end

  #…
end