代码之家  ›  专栏  ›  技术社区  ›  Jbur43

NilClass link.user.email的未定义方法“email”

  •  2
  • Jbur43  · 技术社区  · 8 年前

    在我的 index.html.erb 文件,我得到了一个未定义的电子邮件方法。我进入rails控制台,尝试运行User.first。电子邮件和它完美地工作。我试着拿出电子邮件然后跑步 link.user 这也起了作用。我不确定为什么当有一个用户绑定到一个链接并且一个用户有一封电子邮件时,电子邮件会被视为未定义。我正在寻找一些可能出问题的建议。

    索引.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
    

    链路控制器:

    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)
    
    5 回复  |  直到 8 年前
        1
  •  7
  •   K M Rakibul Islam    8 年前
    undefined method `email' for nil:NilClass link.user.email
    

    您收到此错误是因为 link.user nil 对于某些链接,因此它调用 nil.email 并以所述错误消息失败。

    您可以使用 try 要像这样解决这个问题:

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

    这样,即使在 链接.用户 对于某些情况。

        2
  •  2
  •   Richard Peck    8 年前

    我知道你接受了另一个答案,但我认为这是不正确的。


    错误意味着您没有关联 user 对象 link .

    如果你是 期望 每个 链接 有关联的 使用者 ,使用 validation 以确保其在 create update :

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

    这意味着每次创建 链接 有一个 User 对象首先防止错误。

    --

    如果这就是你需要你的应用程序运行的方式(只有IE用户可以发布链接或其他),你就不需要 .nil? .try() 视图中的条件语句。

    简言之,我认为公认的答案就像在铁锈上作画(无意冒犯等)。

        3
  •  1
  •   Yang    8 年前

    此错误的原因是 link.user nil .你得检查一下是不是 例如:

    <% if !link.user.nil? %>
      <%= link.user.email %>
    <% end %>
    
        4
  •  1
  •   Rajarshi Das    8 年前

    可能有一些 email nil 对于那个特定的 user 你可以使用 try 逃离 undefined method for NilClass

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

    如果 使用者 那是零 link 而且

    <%= link.user.try(:email) %> 
    
        5
  •  0
  •   Hansol    7 年前

    我想你需要检查链接迁移文件

    class CreateLinks < ActiveRecord::Migration
    

    在此文件中,您需要 t.belongs_to :user_id