NoMethodError в UserController # зарегистрируйте неопределенный метод `save 'для nil: NilClass - PullRequest
1 голос
/ 09 октября 2019

Пытаясь выучить ruby ​​на рельсах, следуя инструкции Майкла Хартла, когда я пытаюсь перейти на страницу регистрации в книге, я получаю это:

NoMethodError в UserController # зарегистрировать неопределенный метод `save 'дляnil: NilClass

вот код из файла user_controller.rb:

   class UserController < ApplicationController
    def index
     @title = "RailsSpace User Hub"
     end

     def register
     @title = "Register"
     if request.post? and params[:user]
    @user = User.new(user_params)
    end
    if @user.save
    flash[:notice] = "User #{@user.screen_name} created!"
    redirect_to :action => "index"
   end
  end

  private

  def user_params
  # Add the user attributes that you sent with post (form) to the permit 
   method.
  params.require(:user).permit(:name, :screen_name)
  end
end

Он жалуется на строку 11, где написано: if @user.save Я просто следую заучебник, я не знаю, что происходит.

Ответы [ 2 ]

2 голосов
/ 09 октября 2019

Попытайтесь понять, что говорит сообщение об ошибке. Вы пытаетесь позвонить .save на @user, но там, где вы звоните, @user может быть не определено. Проблема в том, что вы не можете вызвать .save для нулевого объекта, поэтому он выдает NoMethodError.

Ваша логика неверна, поэтому вы должны сначала убедиться, что @user создает новый Userэкземпляр. Это должно быть больше так:

def register
  @title = "Register"
  if request.post? && params[:user]
    @user = User.new(user_params)
    if @user.save
      flash[:notice] = "User #{@user.screen_name} created!"
      redirect_to :action => "index"
    else
      # handle erorrs here
      flash[:alert] = "Please fix errors: #{@user.errors.full_messages.inspect}"
      redirect_to :back #this may need to change depending, just an example.
    end
  end
end
0 голосов
/ 09 октября 2019

NoMethodError in UserController#register undefined method 'save' for nil:NilClass

Ошибка выдается, потому что вы звоните save на nil;и это потому, что nil объект не имеет этот метод. save - это метод экземпляра, принадлежащий классу ActiveRecord::Base.

Причина, по которой @user равен nil, заключается в том, что @user является переменной экземпляра в классе UserController, который вы ему не предоставили. стоимость. Любая переменная, начинающаяся с @ внутри класса, является переменной экземпляра в Ruby.

Чтобы решить эту проблему, вы должны установить значение @user, и в этом случае это должен быть экземпляр User. Вы можете создать новый пользовательский объект, выполнив @user = User.new(user_params), или выбрать запись из базы данных, выполнив @user = User.find(<some_id>)

...