undefined 方法 'read' for nil:nilClass



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

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

我真的很感激你的帮助。

您的代码有几个问题。

首先,您尝试使用相同的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。因此,对其调用任何方法都会引发错误。

错误正是它所说的:

 params[:resume].nil?

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

您可以检查您的参数是否由填充

 unless params[:resume].blank?
    r = params[:resume].read
 end

相关内容

最新更新