NoMethodError (неопределенный метод user_id для nil: NilClass): - PullRequest
1 голос
/ 12 июля 2020

Я создал это приложение для отображения пользователей или владельцев узлов, но теперь, когда я пытаюсь войти в систему, приложение выходит из строя с сообщением:

NoMethodError (undefined method `user_id' for nil:NilClass):

Вот строка кода, в которой возникает ошибка указывая на

users_controllers.rb

 def authenticate
    if params[:authentication] and authenticate = params[:authentication] and authenticate[:email].length > 0 and authenticate[:password].length > 0
      username = authenticate[:email]
      password = authenticate[:password]

      super_user = User.find(TheChosenOne.first.user_id) # This is the problematic line
      if username == super_user.email
        if Digest::SHA1.hexdigest(password) == TheChosenOne.first.password
          session[:user_id] = super_user.id
          redirect_to controller: :nodes, action: :list
        else
          redirect_to controller: :users, action: :login, alert: 'invalid_credentials' and return
        end
      else
        ret_result = nil
        command = Thread.new do
          ret_result  = `cd #{Rails.root}/Auth/src/; java AuthorizationService '#{username}' '#{password}'`
        end
        command.join

        if !ret_result.include? "true"
          redirect_to controller: :users, action: :login, alert: 'invalid_credentials' and return
        end

        user = User.find_by_email(username)
        if !User.exists?(user)
          user = User.create({email: username})
        end

Я не уверен, нужно ли мне создавать метод user_id в модели пользователя? Для меня это не имеет большого смысла. Пожалуйста, я буду признателен за любую помощь, которую могу получить. Спасибо

1 Ответ

2 голосов
/ 13 июля 2020

Совершенно очевидно, что TheChosenOne.first - это nil, а nil не имеет метода #user_id.

Я предполагаю, что ваш вопрос в основном таков: Как мне узнать почему TheChosenOne.first равно nil?

Мы будем использовать pry, byebug и rails console для отладки. Сначала убедитесь, что pry установлен в вашем Gemfile, если еще не установлен:

group :development, :test do
  gem 'pry-byebug'       # pry integrated with byebug
  gem 'pry-rails'        # integrates pry with rails
end

Сначала bundle install, затем запустите rails console:

% rails console
Running via Spring preloader in process 91323
Loading development environment (Rails 6.0.3.2)
[1] pry(main)> 

Вы должны иметь возможность для выполнения TheChosenOne.first и подтверждения nil:

[1] pry(main)> TheChosenOne.first
=> nil

pry имеет хорошую функцию отладки для проверки исходного кода метода с помощью $:

[2] pry(main)> $ TheChosenOne.first

From: /myrails/app/models/the_chosen_one.rb:2:
Owner: #<Class:TheChosenOne>
Visibility: public
Signature: first()
Number of lines: 3

def self.first
  nil
end

Я создал фиктивный пример, где TheChosenOne.first просто возвращает nil, но вы должны увидеть, как это реализовано и где оно определено. Используйте эту информацию, чтобы копнуть на один уровень глубже, чтобы выяснить, почему он возвращает nil, потому что кажется, что этого не должно быть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...