0

尝试注册新用户时出现此错误。

NoMethodError(未定义的方法save' for nil:NilClass): app/controllers/users_controller.rb:49:in创建'app/controllers/users_controller.rb:48:in `create'

class UsersController < ApplicationController
  before_filter :require_no_user, :only => [:new, :create]
  before_filter :require_user, :only => [:show, :edit, :update]

  #filter_resource_access

  def index
    @users = User.all

    respond_to do |format|
      format.html # index.html.erb
      format.xml  { render :xml => @users }
    end
  end

  def show

    respond_to do |format|
      format.html # show.html.erb
      format.xml  { render :xml => @user }
    end
  end

  def new
    #@user = User.new
    @carriers = Carrier.find(:all)
    respond_to do |format|
      format.html # new.html.erb
      format.xml  { render :xml => @user }
    end
  end

  def edit

  end

  def create
    @user = User.new(params[:user])
    if @user.save
      flash[:notice] = "Account registered!"
      redirect_back_or_default account_url
    else
      render :action => :new
    end
  end

  def profile
    @user = User.find(params[:id])
  end

  def update

    respond_to do |format|
      if @user.update_attributes(params[:user])
        format.html { redirect_to(@user, :notice => 'User was successfully updated.') }
        format.xml  { head :ok }
      else
        format.html { render :action => "edit" }
        format.xml  { render :xml => @user.errors, :status => :unprocessable_entity }
      end
    end
  end

  def destroy
    @user = User.find(params[:id])
    @user.destroy
    respond_to do |format|
      format.html { redirect_to(users_url) }
      format.xml  { head :ok }
    end
  end

  def delete
    @user = User.find(params[:user_id])
    @user.destroy
    redirect_to :users
  end

end
4

2 回答 2

1

没有看到您的视图代码,很难说,但是由于您已经注释掉了@user发送到新视图的对象,也许从视图返回的参数没有定义为表单中的键值对作为用户属性?

于 2011-01-18T02:16:16.200 回答
1

发生错误是因为 @user 变量为零,因此调用 (nil).save 将失败。这意味着 User.new(params[:user]) 返回 nil,这永远不会发生。User.new 应该总是返回一条记录,即使它是无效的。

因此,由于控制器看起来很普通,我会在黑暗中拍摄并建议检查您的用户模型是否有“新”方法。您可能会使用一些返回 nil 并破坏您的控制器的逻辑来覆盖 ActiveRecord 的“新”方法。如果是这样,您必须用不同的方法名称替换“def new”。

如果这没有帮助,请向我们提供您的用户模型中的代码。

于 2011-01-18T05:49:32.400 回答