Всем привет, я новичок в рельсах и по какой-то причине все время получаю ошибку

undefined method 'user' for nil:NilClass.

Я вставил изображение ошибки внизу и разместил код ниже.

Ошибка изображения

# registeredapps_controller.rb

class RegisteredappsController < ApplicationController

 def create
   @registeredapp = Registeredapp.new(registeredapp_params)
   @registeredapp.user = current_user

  unless RegisteredappPolicy.new(current_user, @registeredapp).create?
    flash[:alert] = "not authorized" 
    redirect_to user_registeredapps_path(current_user.id)
  end

  if @registeredapp.save
    flash[:notice] = "You successfully registered your app."
    redirect_to user_registeredapp_path(current_user.id, @registeredapp.id)
  else
    flash.now[:alert] = "There was an error registering your app. Please try again."
    render :new
  end
end

Политики (с использованием Pundit Gem)
# registeredapp_policy.rb

class RegisteredappPolicy 

  def initialize(user, registeredapp)
    @registeredapp = registeredapp
    @user = user
  end

  def create?
    if @user.present?
     @user = @registerdapp.user
    else
     false
  end
end

Вот мои модели

# models/user.rb

class User < ApplicationRecord

  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
     :recoverable, :rememberable, :trackable, :validatable, :confirmable

  def avatar_url(size)
    gravatar_id = Digest::MD5::hexdigest(self.email).downcase
    "http://gravatar.com/avatar/#{gravatar_id}.png?s=#{size}"
  end

  has_many :registeredapps
end

# models/registeredapp.rb

class Registeredapp < ApplicationRecord
  belongs_to :user
  has_many :events
end
0
Hamel Desai 27 Сен 2016 в 17:04

3 ответа

Лучший ответ

Ваша проблема в том, что переменная экземпляра @registeredapp написана неправильно в классе RegisteredappPolicy в методе create?.

В настоящее время

def create?
  if @user.present?
    @user = @registerdapp.user
  else
    false
  end
end

Тогда как переменная, определенная в инициализации, это @registeredapp, вам не хватает e

1
Leo Correa 27 Сен 2016 в 14:09

Соглашение Rails обычно должно иметь название модели, например:

User

И соответствующее имя таблицы, например:

users

В вашем ActiveRecord :: Registeredapp у вас есть :user, проверьте, не должно ли у вас быть :users.

0
José Pinto 27 Сен 2016 в 14:13

@registerdapp равно nil

@user = @registerdapp.user

Используйте try

@user = @registerdapp.try(:user)

Или

def create?
  if @user.present? && @registerdapp.present?
    @user = @registerdapp.user
  else
    false
  end
end

ПРИМЕЧАНИЕ. Также вам не хватает одного end для if else в методе create?

0
Deepak Mahakale 27 Сен 2016 в 14:05