在html.erb文件中没有将nil隐式转换为String

时间:2017-03-02 10:28:58

标签: ruby-on-rails ruby actionmailer

以下是我的许多邮件模板之一:

<% if @system_email.present? && @system_email.try(:content).present? %>
  <%= @system_email.content.to_s.gsub(
  "::vUserName::", @wanted_equipment.try(:name) ).gsub(
  "::iListingId::", @equipment.identifier).gsub(
  "::vListingTitle::", @equipment.title).gsub(
  "::vCategoryName::", @equipment.try(:category).try(:name)).gsub(
  "::eListingType::", @equipment.listing_type ).gsub(
  "::SYSTEM_COMPANY_NAME::", @system_company_name).gsub(
  "::SITE_LISTING_URL::", link_to(@system_site_url, equipment_details_url(@equipment.slug))).html_safe
  %>

ApplicationMailer

def newequip_matches_wanted
    @system_email = SystemEmail.find_by(title: 'Equipment matches WantedEquipment')
    @subject = @system_email.try(:subject).to_s
    @subject = "Equipment matches WantedEquipment" if @subject.blank?
    @equipment = Equipment.last
end

在尝试渲染此html.erb模板时,它会抛出错误说:

no implicit conversion of nil into String
Extracted source (around line #2):

<% if @system_email.present? && @system_email.try(:content).present? %>
  <%= @system_email.content.to_s.gsub(..

我正在添加email.content只是为了显示考虑评论:

@system_email = SystemEmail.find_by(title: 'Equipment matches WantedEquipment')



 => #<SystemEmail id: 28, identifier: "MAIL-0000028", title: "Equipment matches WantedEquipment", subject: "Equipment matches WantedEquipment", content: "<p>Hello <strong>::vUserName::</strong>,</p>\r\n    ...", footer: nil, status: 1, created_at: "2017-03-01 07:36:30", updated_at: "2017-03-01 07:40:07"> 

相同的模板适用于其他邮件程序。但它在这里抛出一个错误。有人能告诉我这里有什么问题吗?

1 个答案:

答案 0 :(得分:1)

它表示隐式转换,显式存在:

2.3.1 :001 > nil.to_s
 => "" 

所以你没有以下任何一个:@ equipment中的identifier,title,listing_type,slug,@ system_site_url或@system_company_name。 我也不知道你是否真的想使用@ equipment.title或使用电子邮件的标题。

这有点奇怪,但你可以尝试一下。重新定义NilClass的to_s方法并将to_s添加到每个字段。它会弹出你错过的东西。

class NilClass
  def to_s; "NILNILNIL"; end
end
...
2.3.1 :010 > nil.to_s
 => "NILNILNIL"