如何将邮件发送给帖子中列出其用户名的所有用户?

时间:2014-08-02 15:29:20

标签: ruby-on-rails ruby-on-rails-3

目前,我正在使用此代码向用户在帖子中列出的用户发送通知邮件。

target_user = params[:comment][:body].scan(/(?<=^@)\w+(?=[\s|~])/).first
@target_user = User.find_by_username(target_user)
current_user.send_message(@target_user, body, subject)

然而,问题在于它无法将消息发送给多个人:(

如何更改我的代码才能实现这一目标?

假设 params [:comment] [:body] 的内容就像这样

@JohnWhite @EmilyBrown @AdamKaylor

我想获取所有3个用户对象,并重复

  

current_user.send_message(@target_user,body,subject)

3次。

1 个答案:

答案 0 :(得分:1)

我看到了两种可能的方法,具体取决于您的使用方式String#scan请参阅http://www.ruby-doc.org/core-2.1.2/String.html#method-i-scan

没有块扫描将返回一个匹配数组,所以如果你删除.first,你可以迭代数组并发送通知

target_users = params[:comment][:body].scan(/(?<=@)\w+(?=[\s|~])/)
target_users.each do |target_user|
    @target_user = User.find_by_username(target_user)
    current_user.send_message(@target_user, body, subject)
end 

或者如果您传递一个块进行扫描,您可以在找到它时处理每个匹配。

 params[:comment][:body].scan(/(?<=@)\w+(?=[\s|~])/) do |target_user|
     @target_user = User.find_by_username(target_user)
     current_user.send_message(@target_user, body, subject)
 end

两者都应该做同样的事情,但我也没有测试过。

- 编辑 -

删除@上的^锚点,这样它就会从字符串中拉出所有@mentions,而不仅仅是它是第一行的。

>> "dfdfd @JohnWhite @EmilyBrown test".scan(/(?<=@)\w+(?=[\s|~])/)
=> ["JohnWhite", "EmilyBrown"]