Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/54.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 正在向多个用户发送Sms消息_Ruby On Rails_Ruby_Twilio - Fatal编程技术网

Ruby on rails 正在向多个用户发送Sms消息

Ruby on rails 正在向多个用户发送Sms消息,ruby-on-rails,ruby,twilio,Ruby On Rails,Ruby,Twilio,我收到一份来自多个用户的报告,他们收到了多条短信验证消息,尽管他们只点击了一次按钮 下面的代码是处理该部件(控制器)的代码: 模型: def generate_sms_code! range = (10000..99999).to_a update_attribute :sms_code, range[rand(range.length)] end def sms TWILIO_CLIENT.account.sms.messages.create( :from =>

我收到一份来自多个用户的报告,他们收到了多条短信验证消息,尽管他们只点击了一次按钮

下面的代码是处理该部件(控制器)的代码:

模型:

def generate_sms_code!
  range = (10000..99999).to_a
  update_attribute :sms_code, range[rand(range.length)]
end

def sms
  TWILIO_CLIENT.account.sms.messages.create(
    :from => TWILIO_SMS_NUMBER,
    :to => self.phone,
    :body => "Please confirm! Your verification code is: #{sms_code}"
  )
end
也许自从上次发送后,我需要在后端做些什么?有没有办法解决这个问题,或者如何防止向同一用户发送多条短信

详细信息:

我将在前端消除疑虑。

天真的解决方案:


您可以在
用户
模型中添加
last\u message\u sent\u at
属性,如果
last\u message\u sent
的时间少于1分钟(任意),您可以拒绝发送另一条消息。

我强烈建议您将所有短信记录在数据库中,以备将来参考。这还可以让您查看某人是否在过去X分钟或其他时间内已收到特定消息,从而阻止重复的消息。当然,您仍然应该首先找出重复消息被发送的原因,但这至少提供了一个安全网

几年前,我开发了一个发送短信的应用程序。这是my Message类的架构,它表示已发送的SMS消息:

create_table "messages", :force => true do |t|
  t.text     "body"
  t.datetime "created_at"
  t.integer  "user_id"
  t.string   "to_number"     #the phone number
  t.datetime "sent_at"
  t.boolean  "successful"
  t.text     "kind"          #a short string from a predefined list - "welcome", "daily_reminder", "task_complete" etc
end
您应该将所有SMS发送功能移到SMS类中,以便控制器代码看起来像这样:

@sms = @user.messages.create(:body => "Welcome to MyApp.com")
@sms.deliver
有几种不同的方法可以阻止重复的消息。一种方法是,如果最近发送了一条消息,则使其无效,并确保.deliver方法不会发送未保存的消息(如果无效,则不会保存)。乙二醇

class消息?”,self.user\u id,self.body,self.id,1.hour.ago])。有吗?
self.errors.add(:body,“最近已发送”)
结束
结束
def交付
如果self.new\u记录,则返回false?
#用于填写任何必要字段(如to_编号)并在此处发送SMS的代码
...
结束

我认为您应该使用像update\u Sms\u change(anthing)这样的方法,并在用户控制器的更新操作中调用它,而不是在update\u属性回调中调用它。如果您取消javascript按钮的抖动,可能会起作用,因为这几乎肯定是问题的原因。@mcfinnigan我取消抖动,这是我的第一个反应。我也推荐类似的东西,尽管你应该有一个发送短信记录表(如SentSms模型),你可以查询它来查看最近是否发送了相同的消息,而不是在用户模式中添加一个新字段。出于各种原因,您仍然需要这些数据。@MaxWilliams向该应用程序添加其他型号的原因是什么?与仅仅添加列来保存时间戳信息不同,在某个时候,您或其他人会想知道某个特定的sms是否在某天发出。如果您没有在每次发送短信时都进行db记录,那么您将无法回答该问题。@Max Williams您能否像您的评论一样发布一个答案,我想我将使用新的模型和数据库表
@sms = @user.messages.create(:body => "Welcome to MyApp.com")
@sms.deliver
class Message < ActiveRecord::Base

  validate :not_a_repetition

  def not_a_repetition
    if Message.where(["user_id = ? and body = ? and id <> ? and sent_at > ?", self.user_id, self.body, self.id, 1.hour.ago]).any?
      self.errors.add(:body, "has already been sent recently")
    end
  end

  def deliver
    return false if self.new_record?
    #code for filling in any necessary fields (eg to_number) and sending the SMS here
    ...
  end