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.user
是 nil
。你必须检查它是否 nil
像:
<% if !link.user.nil? %>
<%= link.user.email %>
<% end %>
undefined method `email' for nil:NilClass link.user.email
您收到此错误是因为某些链接的 link.user
是 nil
,因此它调用 nil.email
并失败并显示上述错误消息。
您可以使用 try 解决这个问题,如下所示:
<%= link.user.try(:email) %>
这样即使在某些情况下 link.user
为 nil
,您的程序也不会崩溃。
对于那个特定的 user
可能有一些 email
是 nil
你可以使用 try
来逃避 undefined method for NilClass
<%= link.try(:user).try(:email) %>
如果 user
为零,link
也
或
<%= link.user.try(:email) %>
我知道您接受了另一个答案,但我认为它不正确。
该错误意味着您没有 link
的关联 user
对象。
如果您期望每个link
有一个关联的user
,您最好使用validation
来确保它出现在 create
或 update
:
#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
在我的 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.user
是 nil
。你必须检查它是否 nil
像:
<% if !link.user.nil? %>
<%= link.user.email %>
<% end %>
undefined method `email' for nil:NilClass link.user.email
您收到此错误是因为某些链接的 link.user
是 nil
,因此它调用 nil.email
并失败并显示上述错误消息。
您可以使用 try 解决这个问题,如下所示:
<%= link.user.try(:email) %>
这样即使在某些情况下 link.user
为 nil
,您的程序也不会崩溃。
对于那个特定的 user
可能有一些 email
是 nil
你可以使用 try
来逃避 undefined method for NilClass
<%= link.try(:user).try(:email) %>
如果 user
为零,link
也
或
<%= link.user.try(:email) %>
我知道您接受了另一个答案,但我认为它不正确。
该错误意味着您没有 link
的关联 user
对象。
如果您期望每个link
有一个关联的user
,您最好使用validation
来确保它出现在 create
或 update
:
#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