неопределенный метод `save 'для nil: NilClass - PullRequest
0 голосов
/ 18 января 2011

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

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

Ответы [ 2 ]

1 голос
/ 18 января 2011

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

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

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

1 голос
/ 18 января 2011

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

...