未定义的方法`read'为零:NilClass

时间:2014-09-08 19:42:13

标签: ruby-on-rails ruby

为什么我会得到未定义的方法`read' for nil:当我尝试通过电子邮件发送上传的附件时,是否为NilClass?

listings_controller.rb

def send_resume_email
  @listing = Listing.find(params[:id])
  @user = User.find_by_id(params[:id])
  UserMailer.new_resume(params[:resume].read(), params[:resume].original_filename, @user, @listing).deliver
  redirect_to findjobs_path, notice: 'Message sent'
end

user_mailer.rb

def new_resume(user, listing, file, filename)
  @listing = listing
  @user = user
  attachments[filename] = file
  @url = 'http://www.new.com'
  mail(to: listing.user.email, subject: 'Thanks for the awesome site')
end

我非常感谢你的帮助。

2 个答案:

答案 0 :(得分:0)

错误正是它所说的:

 params[:resume].nil?

将评估为true,当然,nil:NilClass没有读取方法。

您可以通过

检查您的参数是否正在填充
 unless params[:resume].blank?
    r = params[:resume].read
 end

答案 1 :(得分:0)

您的代码存在一些问题。

首先,您尝试使用相同的id参数找到两个资源。 params[:id]应属于用户或列表。它是哪一个?

另一方面,User.find_by_id(params[:id])是多余的。 User.find(params[:id])就足够了,因为find的默认查找值为id

  @listing = Listing.find(params[:id])
  @user = User.find_by_id(params[:id])

最后,您在params哈希上调用方法read()

UserMailer.new_resume(params[:resume].read(), params[:resume].original_filename, @user, @listing).deliver

哈希来自哪里? params[:resume]如何拥有一个可以调用read()的实例化对象?通常param哈希是表单提交或浏览器请求的结果,因此它不太可能包含可以调用方法的实例化对象。

这是你的错误的来源。该错误告诉您params[:resume]nil。因此,调用任何方法都会引发错误。