【问题标题】:How to use values of a hash dynamically?如何动态使用哈希值?
【发布时间】:2017-08-29 22:06:34
【问题描述】:

目标:在电子邮件标题中使用唯一的电子邮件地址收件人:MIME Html 消息的字段(请参阅 message_class)。

文件:database.rb 在这里我连接到数据库并循环遍历表rcpt 中的行。然后我将值存储在row["email"]

require 'mysql2'

class Db

  def con
    @db_host = "localhost"
    @db_user = "root"
    @db_pass = "password"
    @db_name = "table_db"

    client = Mysql2::Client.new(:host => @db_host, :unsername => @db_user, :password => @db_pass, :database => @db_name)
    rcpt = client.query("SELECT * from rcpt")
    rcpt.each do |row|
      row["email"]
    end
  end
end

不带 ["email"] 的 con 方法的输出:

{"id"=>01, "email"=>"example1@example.com"}
{"id"=>02, "email"=>"example2@example.com"}

con 方法的输出,带有 ["email"]:

example1@example.com
example2@example.com

数据库架构:

mysql> describe rcpt;
+-------+--------------+------+-----+---------+----------------+
| Field | Type         | Null | Key | Default | Extra          |
+-------+--------------+------+-----+---------+----------------+
| id    | int(11)      | NO   | PRI | NULL    | auto_increment |
| email | varchar(150) | NO   | UNI | NULL    |                |
+-------+--------------+------+-----+---------+----------------+
2 rows in set (0.00 sec)

文件:message_class.rb 这里我创建了方法pull_rcpt,然后存储row["email"]。然后我尝试在messageheredoc 中使用pull_rcpt 方法。现在出现了我的问题:在To: 字段中,我正在尝试传递我当前发送到的用户电子邮件地址,因此它应该随着接收电子邮件地址而改变。它仍然使用数组/Db 中第一个联系人的电子邮件地址。我做错了什么?

require 'dkim'
require './database'

class Email

  def pull_rcpt
    rcpt = Db.new
    rcpt.con
  end

  def data
    Dkim::domain      = 'example.com'
    Dkim::selector    = 'mail'
    Dkim::private_key = open('/path/to/keys/example.com/mail.private').read 

    message = <<~MESSAGE
    From: Eva <test@example.com>
    To: Dani <#{pull_rcpt[0]["email"]}>
    MIME-Version: 1.0
    Content-Type: text/html
    Content-Transfer-Encoding: 8bit
    Subject: Test Subject

    This is an email message.
    <h1>Test</h1>
    MESSAGE
   end
end

文件:mailer_class.rb 在我的 mailer_class 中,我有两个方法 rcpt_tomessage。 rcpt_to 包含一个数组contacts,其中包含row["email"] 的值。消息构建电子邮件。

require './database'
require './message_class'

def rcpt_to
#conn zu DB & take rcpt
  contacts = []
  contacts = Db.new
  contacts.con
end

def message 
#message
  message = Email.new
end

for loop 后面几行我使用如下方法:

 for rcpt in rcpt_to do
  @protocol = { ehlo: "ehlo", mail_from: "eva@example.com", rcpt_to: [rcpt["email"]], data: Dkim.sign(message.data) }
 end

这里是 example2@example.com 的标题,它是数据库中的第二条记录:

 From: Eva <test@example.com>
 To: Dani <example1@example.com> <--- This should be example2(value in hash of second entry in database) not example1
 MIME-Version: 1.0
 Content-Type: text/html
 Content-Transfer-Encoding: 8bit
 Subject: Test Subject
 Content-Length: 40

所以唯一不起作用的是电子邮件标题中的动态 To: 字段。其余的工作正常,数据库中的所有记录都会收到一封电子邮件。

【问题讨论】:

  • 请提供minimal reproducible example。你的例子不完整(它需要一个数据库,但你没有提供方案),它可能不是最小的(我非常怀疑,你需要 50 行来演示这个问题)。
  • 我已经更新了数据库架构。
  • “我做错了什么?” - 这个:#{pull_rcpt[0]["email"]}。您明确告诉它始终使用第一行的电子邮件。
  • rcpt.each do |row| 不会返回您认为的结果。
  • 我应该使用 rcpt.each_with_index {|(key, value), index| }?

标签: arrays ruby loops mysql2 ruby-hash


【解决方案1】:

如前所述,这一行是问题的核心:&lt;#{pull_rcpt[0]["email"]}&gt;。您正在明确选择数据库中的第一个元素。要动态创建标头,您必须将参数传递给数据方法。

所以这是解决这个问题的一种方法:

在课堂电子邮件中,将def data 更改为def data(dynamic_email),然后 To: Dani &lt;#{pull_rcpt[0]["email"]}&gt;To: Dani &lt;#{dynamic_email}&gt;

在循环内: data: Dkim.sign(message.data) => data: Dkim.sign(message.data(rcpt["email"]))

类似的东西应该可以工作。

附带说明,您的代码可以进行一些重构。例如,你写的 con-method 不像你想的那样起作用。 "each" 返回数组本身。如果你把它放在这样的方法的最后一行,它就没有任何用处。在这种情况下,它相当于写return rcpt。如果您希望该方法返回一个电子邮件地址数组,您应该使用 map 而不是 each(甚至更好,重写您的 sql 查询)。但是,当然,如果你改变它,它会破坏你的其余代码。懒惰的解决方案只是删除每个循环......

【讨论】:

  • 非常感谢an491445!!懒惰的版本有效,但现在我很兴奋,你认为最有效的方法是什么?我想重构数据库。提前致谢!
  • 好吧,由于 rcpt-table 只有两行,我想这不会提高效率,但正如你所问的......我的印象是你想要 con 返回一个电子邮件地址数组,而不是哈希数组。将每个更改为地图将解决该问题。您还可以查看 client.query 是否可以接受其他参数。将SELECT * from rcpt 更改为SELECT email from rcpt 将是一个开始,但我想它仍然会给你一个哈希数组。无论如何,如果您更改 con 返回的内容,您将不得不修改其余代码。例如rcpt['email'] => rcpt 在循环内。
猜你喜欢
  • 1970-01-01
  • 2019-07-22
  • 2018-04-14
  • 2014-02-27
  • 1970-01-01
  • 2015-08-15
  • 1970-01-01
  • 2014-04-13
  • 1970-01-01
相关资源
最近更新 更多