模型之间的关系不像预期的那样工作

时间:2012-11-02 23:59:13

标签: ruby-on-rails-3 activerecord

我有3个基本上嵌套的模型。

class User < ActiveRecord::Base
  attr_accessible :birthday, :name
  has_one :advancement, :dependent => :destroy
  accepts_nested_attributes_for :advancement
  attr_accessible :advancement_attributes
end

class Advancement < ActiveRecord::Base
  attr_accessible :user_id, :rank_name
  belongs_to :user
  has_one :rank, :dependent => :destroy
  accepts_nested_attributes_for :_rank
  attr_accessible :rank_attributes
end

class Rank < ActiveRecord::Base
  attr_accessible :advancement_id, :one_li, :one_pi, :one_date, ...
  belongs_to :advancement
end

这是我用来创建模型的控制器代码。

class UsersController < ApplicationController
  def new
    @user = User.new
    @user.advancement = Advancement.new
    @user.advancement.rank = Rank.new

    respond_to do |format|
      format.html # new.html.erb
    end
  end

  def create
    @user = User.new(params[:user])
    @user.advancement = Advancement.new
    @user.advancement.rank = Rank.new

    respond_to do |format|
      if @user.save
        format.html { redirect_to @user, notice: 'User was successfully created.' }
      else
        format.html { render action: "new" }
      end
    end
  end
end

在控制台中,我可以创建像我期望的那样工作的关系。当我尝试通过浏览器执行此操作时,我的所有对象都被实例化,外键是正确的,但如果我尝试查找user.advancement,我会得到一个方法丢失错误。我使用新的还是创造了错误,如果是的话我该怎么办?很抱歉代码的数量,但我不知道任何其他方式来解释它。

2 个答案:

答案 0 :(得分:0)

首先,在大多数代码中,您引用了“排名”模型,但模型本身似乎被称为“BoyScoutRank”。这可能是问题吗?

答案 1 :(得分:0)

正如Thanh所指出的,你有Accept_nested_attributes_for:_rank而不是:rank。您也不需要在创建中创建新的Advancement和Rank模型。 accepts_nested_attributes应该为你处理。

以下是否有效(一旦修复:_rank问题):

@user = User.new(params[:user])