为什么会出现“undefined method `encoding'”错误?

5
为什么会出现“undefined method 'encoding'”? 我该如何解决这个问题?
错误信息:
NoMethodError (undefined method `encoding' for #<Array:0x000000218f61e8>):
 app/controllers/messages_controller.rb:255:in `deliver'

messages_controller.rb

# coding: UTF-8

class MessagesController < ApplicationController

    deliver
        users = User.confirmed.order("created_at ASC")

        @users_emails = []          
        users.each do |user|
            @users_emails += [user.email]
        end

        subject = params[:messages][:subject] 
        body = params[:messages][:body]

        CallMailer.call_email(@users_emails, subject, body).deliver  <= This is line 255  
    end

end

mailers/call_mailer.rb

# coding: UTF-8

class CallMailer < ActionMailer::Base

    default :from => "dont-reply@example.com"

    def call_email(users_emails, mesesage_subject, mesesage_body)
        @users_emails = users_emails
        @mesesage_subject = mesesage_subject
        @mesesage_body = mesesage_body
        mail(
            :bcc => @users_emails,
            :subject => @mesesage_subject,
            :body => @mesesage_body) do |format|
            format.html
        end
    end

end

1
可能这个链接会有帮助 https://github.com/mikel/mail/issues/417 - Debadatt
@Debadatt 可能就是这样!你可以给我展示如何修复我的代码吗? - MKK
3个回答

10

我发现你可能在bcc中得到了正确的数组,但可能由于某些电子邮件地址打错了字。

当电子邮件地址在@之前包含点号(例如test.@test.com),并作为数组的一部分提交时,您会收到“undefined method `encoding' for Array”的错误。这个错误只出现在Ruby 1.9中,而且只有在地址作为数组提交时才会出现。

请尝试这个方法

def call_email(users_emails, mesesage_subject, mesesage_body)
        @users_emails = users_emails
        @mesesage_subject = mesesage_subject
        @mesesage_body = mesesage_body
        mail(
            :bcc => @users_emails.join(','),
            :subject => @mesesage_subject,
            :body => @mesesage_body) do |format|
            format.html
        end
    end

谢谢!这就是它!关键的答案! - MKK
这不仅发生在BCC或在@之前有.的情况下。对我来说,这种情况一直发生。我解决了。driver_managers_team:%w(mail1@example.co mail2@example.co)。join(',') - Neoecos

3
在你的CallMailer中,因为:bcc只使用字符串而不是数组,所以你需要做些更改。
@user_emails.each do |email|     
  mail(
        :bcc => email,
        :subject => @mesesage_subject,
        :body => @mesesage_body) do |format|
        format.html
    end 
end  

谢谢


:bcc => @users_emails 替换为 :bcc => [@users_emails] 如何? - MKK
@user_emails.each do |email| - user2613217
你确定这部分是 ,... 吗? - MKK
你为什么要单独让它工作?难道你不是用 :to 的方式吗?我认为如果它是数组并且设置为 bcc,你可以一次性设置整个。 - MKK
请查看 Rajarshi 的帖子,那是一个更好的方式。 - user2613217
显示剩余2条评论

2

实际上,bcc将会是这个样子

 mail(:to => "rails@example.com" ,  :subject => "Example Rails"
 :bcc => ["bcc@rails.com", "Rails Group <railsgroup@example.com>"] ,
 :cc => "other@example.com" )

所以您可以做一件事,将BCC设置为以下内容:
bcc = []
@user_emails.each do |email|
bcc << email + ","
end

    mail(:to => "rails@example.com",:subject => "Example Rails", :bcc => bcc, :cc => "other@example.com" ) 

谢谢


那么将 :bcc => @users_emails 替换为 :bcc => [@users_emails] 怎么样? - MKK

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接