nil:NilClass link.user.email 的未定义方法“电子邮件”

undefined method `email' for nil:NilClass link.user.email

在我的 index.html.erb 文件中,我收到了一个未定义的电子邮件方法。我进入 rails 控制台并尝试 运行ning User.first.email 并且它运行良好。我尝试取出电子邮件并 运行ning link.user 并且这也有效。我不确定为什么当用户绑定到 link 并且用户有电子邮件时,电子邮件会显示为未定义。我正在寻找一些关于可能出了什么问题的建议。

Index.html.erb

<%= link.user.email %>

架构已经迁移运行

create_table "users", force: :cascade do |t|
    t.string   "email",                  default: "", null: false

型号:

class Link < ActiveRecord::Base
    belongs_to :user
    validates :user, presence: true
    acts_as_votable
    attr_accessor :avatar
    mount_uploader :avatar, AvatarUploader
end

class User < ActiveRecord::Base
    has_many :links
    acts_as_voter
    devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable
end

Link 控制器:

class LinksController < ApplicationController
  before_filter :authenticate_user!, except: [:index, :show]

  def index
    @links = Link.all
  end

  def show
    @link = Link.find(params[:id])
  end

  def new
    @link = Link.new
  end

  def edit
  end

  def create
    @link = Link.new(link_params)

    if @link.save
      redirect_to root_path
    else
      render 'new'
    end
  end

    private
    def link_params
      params.require(:link).permit(:title, :url, :avatar, :user_id)
    end
end

错误信息:

User Load (0.1ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = ?  ORDER BY "users"."id" ASC LIMIT 1  [["id", 1]]
   (0.1ms)  begin transaction
   (0.1ms)  rollback transaction
  Rendered links/_form.html.erb (2.7ms)
  Rendered links/new.html.erb within layouts/application (3.8ms)
Completed 200 OK in 505ms (Views: 143.6ms | ActiveRecord: 0.4ms)

此错误的原因是 link.usernil。你必须检查它是否 nil 像:

<% if !link.user.nil? %>
  <%= link.user.email %>
<% end %>
undefined method `email' for nil:NilClass link.user.email

您收到此错误是因为某些链接的 link.usernil,因此它调用 nil.email 并失败并显示上述错误消息。

您可以使用 try 解决这个问题,如下所示:

<%= link.user.try(:email) %>

这样即使在某些情况下 link.usernil,您的程序也不会崩溃。

对于那个特定的 user 可能有一些 emailnil 你可以使用 try 来逃避 undefined method for NilClass

<%= link.try(:user).try(:email) %> 

如果 user 为零,link

<%= link.user.try(:email) %> 

我知道您接受了另一个答案,但我认为它不正确。


该错误意味着您没有 link 的关联 user 对象。

如果您期望每个link有一个关联的user,您最好使用validation来确保它出现在 createupdate:

#app/models/link.rb
class Link < ActiveRecord::Base
   belongs_to :user
   validates :user, presence: true
end

这意味着每次你创建一个link,它一个User对象;首先防止错误。

--

如果这就是您需要应用程序 运行 的方式(只有 IE 用户可以 post 链接或其他),则不需要 .nil?.try()您认为的条件语句。

简而言之,我认为接受的答案就像在锈上涂漆(无冒犯等)。

我认为你需要检查 Link 迁移文件

class CreateLinks < ActiveRecord::Migration

在这个文件中你需要t.belongs_to :user_id