0

基本的にネストされた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 を見つけようとすると、メソッドが見つからないというエラーが発生します。new または create を間違って使用していますか? もしそうなら、どうすればよいですか? コードの量について申し訳ありませんが、それを説明する他の方法を知りませんでした。

4

2 に答える 2

0

Thanhが指摘したように、:rankの代わりにaccepts_nested_attributes_for :_rankがあります。また、作成時に新しい Advancement および Rank モデルを作成する必要はありません。accept_nested_attributes はそれを処理する必要があります。

次の作業を行います (:_rank の問題を修正すると):

@user = User.new(params[:user])
于 2012-11-03T15:48:04.613 に答える
0

まず、ほとんどのコードで「ランク」モデルを参照していますが、モデル自体は「BoyScoutRank」と呼ばれているようです。これが問題でしょうか?

于 2012-11-03T00:26:20.367 に答える