2014-05-15 3 views
2

버튼을 한 번만 클릭했지만 여러 명의 사용자가 여러 개의 SMS 확인 메일을 보냈다고하는 보고서가 있습니다. 아래여러 사용자에게 SMS를 보내고 있습니다.

코드는 그 부분 (컨트롤러)를 처리하는 것입니다 :

def sms 
    current_user.generate_sms_code! 
    current_user.sms 
end 

모델 :

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 

어쩌면 내가 지난하여 전송하기 때문에 시간의 주위에 백 엔드에서 뭔가를해야합니까? 어떤 아이디어를 어떻게 해결할 것인가 또는 동일한 사용자에게 여러 개의 SMS를 보내는 것을 막기 위해해야 ​​할 일은 무엇입니까?

세부 사항 :

나는 프런트 엔드에 디 바운싱하고있다.

+0

난 당신이 update_Sms_change (anthing)과 같은 방법을 사용하고,이 거의 그대로, 당신은 당신의 자바 스크립트 버튼을 디 바운싱 있습니까 – Arjun

+1

를 작동 할 수있다, 대신 update_attribute 콜백의 user_Controller에서 업데이트 작업에 전화를해야한다고 생각 확실히 문제의 원인. – mcfinnigan

+0

@mcfinnigan 나는 첫 번째 반응이었습니다. –

답변

0

나중에 참조 할 수 있도록 모든 SMS 메시지를 데이터베이스에 기록하는 것이 좋습니다. 이것은 또한 누군가가 이미 지난 X 분 동안 특정 메시지를 보냈는지 여부를 알 수있게 해주 며 반복 된 메시지를 차단합니다. 물론 반복 된 메시지가 처음에 전송되는 이유를 알아야합니다.하지만 이는 최소한 안전망을 제공합니다.

몇 년 전 나는 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 메시지를 표현 내 메시지 클래스에 대한 스키마했다

@sms = @user.messages.create(:body => "Welcome to MyApp.com") 
@sms.deliver 

반복되는 메시지를 차단할 수있는 몇 가지 방법이 있습니다. 한 가지 방법은 최근에 보낸 메시지가있는 경우 메시지를 무효화하고 .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 
0

순진 솔루션 :

당신은 User 모델에 last_message_sent_at 속성을 추가하고 last_message_sent 전에 (임의) 미만 1 분 경우 다른 메시지를 보낼 거부 할 수 있습니다.

+0

비록 당신이 보낸 메시지 테이블 (SentSms 모델과 같은), 당신이 쿼리 할 수있는 새로운 메시지를 추가하는 대신 최근에 같은 메시지가 전송되었는지 확인해야하지만, 이것 역시 추천합니다. 사용자 스키마. 어쨌든이 데이터가 필요한 이유는 다양합니다. –

+0

@MaxWilliams 그 응용 프로그램에 추가 모델을 추가하는 이유는 무엇입니까? 타임 스탬프 정보를 보유하기 위해 열을 추가하는 대신에? – ant

+0

어떤 시점에서, 당신이나 다른 누군가는 그러한 날에 특정한 sms가 발송되었는지 알고 싶어 할 것입니다. sms를 보낼 때마다 db 레코드를 만들지 않으면 질문에 답할 수 없습니다. –

관련 문제