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

然后 Rails 正在从数据库中加载整个practices_users(for current_user) 集合,当您last稍后调用时,它正在调用last类型对象的方法Array

当你这样做

current_user.practices_users.last

在没有进行 pmf 调用的情况下,practices_users还没有将整个集合从数据库加载到数组中,并且 Rails 不会加载整个集合,因为您想要的只是最后一个。当需要加载的只是最后一个项目时,加载一组项目将是一种浪费。所以它将生成只从数据库加载一行的 SQL。

在这种情况下,您需要查看控制台或开发日志以准确了解 SQL Rails 生成的内容以及该 SQL 未返回任何值的原因。然后就会清楚发生了什么。

于 2011-11-04T20:43:27.903 回答