неопределенный метод `сохранить' для nil:NilClass

Я получаю эту ошибку при попытке зарегистрировать нового пользователя.

NoMethodError (неопределенный метод save' for nil:NilClass): app/controllers/users_controller.rb:49:increate' 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

person Antarr Byrd    schedule 18.01.2011    source источник
comment
Можете ли вы вставить класс модели пользователя из app/models/user.rb?   -  person Kunday    schedule 18.01.2011


Ответы (2)


трудно сказать, не видя код вашего представления, но поскольку вы закомментировали объект @user, который отправляется в новое представление, возможно, параметры, возвращаемые из представления, не определены как пары ключ-значение из формы как пользовательские атрибуты?

person Jed Schneider    schedule 18.01.2011
comment
но это не сделало бы User.new(nil) равным нулю. Это будет пользователь со всеми атрибутами, установленными на ноль. - person Kunday; 18.01.2011
comment
Итак, используете ли вы другие обратные вызовы в пользовательской модели для предварительной сборки некоторых атрибутов? Я думаю, нам нужно увидеть вашу связанную модель и код представления. - person Jed Schneider; 18.01.2011

Ошибка возникает из-за того, что переменная @user равна нулю, поэтому вызов (nil).save завершится ошибкой. Это означает, что User.new(params[:user]) возвращает nil, чего никогда не должно происходить. User.new всегда должен возвращать запись, даже если она недействительна.

Итак, поскольку контроллер выглядит довольно обычным, я сделаю снимок в темноте и предлагаю проверить вашу модель пользователя на наличие «нового» метода. Возможно, вы переопределяете «новый» метод ActiveRecord с некоторой логикой, которая возвращает nil и ломает ваш контроллер. Если это так, вы должны заменить 'def new' другим именем метода.

Если это не поможет, предоставьте нам код в вашей модели пользователя.

person ndbroadbent    schedule 18.01.2011