0

Rails 3.1.0 の使用

def create
@practice = Practice.new(params[:practice])

respond_to do |format|
  if (current_user.practices << @practice rescue false)

    pmf = current_user.practices_users.inspect # if this line is removed the following update_attributes method breaks!

    current_user.practices_users.last.update_attributes(:admin_flg => true, :first_name => params[:first_name], :last_name => params[:last_name])
    format.html { redirect_to home_dashboard_path, notice: 'Practice was successfully created.' }
    format.json { render json: @practice, status: :created, location: @practice }
  else
    format.html { render action: "new" }
    format.json { render json: @practice.errors, status: :unprocessable_entity }
  end
end
end

「pmf = ...」行が存在しない場合、この行が表示されます

NoMethodError:
   undefined method `update_attributes' for nil:NilClass

「pmf = ...」行が存在する場合、作成アクションは正常に機能します。何が起こっている?

4

1 に答える 1

2

正確な答えはわかりませんが、デバッグを手伝うことができます...

あなたがするとき

pmf = current_user.practices_users.inspect

practices_usersその後、Rails はデータベースから (current_userの) のセット全体をロードしlast、少し後に呼び出すと、lasttype のオブジェクトでメソッドを呼び出していますArray

あなたがするとき

current_user.practices_users.last

pmf 呼び出しを行わないと、 のセット全体practices_usersがデータベースから配列にロードされず、必要なのは最後のセットだけなので、Rails はセット全体をロードしません。ロードする必要があるのが最後のアイテムだけである場合、アイテムの配列をロードするのは無駄です。したがって、データベースから単一の行のみをロードする SQL が生成されます。

このような状況では、コンソールまたは開発ログを調べて、SQL Rails が生成しているものと、その SQL が値を返さない理由を正確に確認する必要があります。その後、何が起こっているのかが明らかになります。

于 2011-11-04T20:43:27.903 に答える