目前,我正在使用此代码向用户在帖子中列出的用户发送通知邮件。
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次。
答案 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"]