Rails undefined方法`user'代表nil:NilClass

时间:2016-09-27 14:04:05

标签: ruby-on-rails ruby

大家好我是rails的新手,出于某些原因我一直收到错误

undefined method 'user' for nil:NilClass

我在底部贴了一个错误图片,我发布了下面的代码。

Image Error

# 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

3 个答案:

答案 0 :(得分:1)

您的问题是实例变量@registeredappRegisteredappPolicy方法的create?类中被拼错了。

目前是

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

而初始化中定义的变量是@registeredapp,你错过了e

答案 1 :(得分:0)

@registerdappnil

@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?

答案 2 :(得分:0)

Rails约定通常是让模型名称如下:

User

及其对应的表名如:

users

在您的ActiveRecord :: Registeredapp中,您有:user,请检查您是否应该:users