Rails安排短信发送者

时间:2015-07-23 22:33:46

标签: ruby-on-rails ruby sms twilio

我想每5分钟向我的用户发送一条短信。目前,我的应用程序在创建帐户期间发送短信。

# users_controller.rb
def create
      @user = User.new(user_params)
      if @user.save
        @user.send_activation_email
        @user.send_daily_sms
        flash[:info] = "Veuillez contrôler votre boîte mail pour activer votre compte."
        redirect_to root_url
      else
        render 'new'
      end
    end

# user.rb
def send_daily_sms

    # put your own credentials here 
    account_sid = '**********************' 
    auth_token = '**********************' 

    # set up a client to talk to the Twilio REST API 
    @client = Twilio::REST::Client.new account_sid, auth_token 

    @client.account.messages.create({
        :from => '**********', 
        :to => '***********', 
        :body => 'Salut',  
    })
  end

通过这样做,我已经在我的项目中安排了邮件:

# schedule.rb
every :day, :at => '12pm' do    
  rake "email_sender_daily"
end
# My task
task :email_sender_daily => :environment do |_, args|
  User.find_each do |user|
    UserMailer.daily_mail(user).deliver_now if user.daily == true
  end
end
# My UserMailer
def daily_mail(user)
@user = user
mail to: user.email, subject: "Mail journalier"
end

我告诉你这个,因为使用UserMailer,我知道如何从其他文件访问它。在这里,我想对SMS做同样的事情,但是如何访问模型中的方法?如果没有,我在哪里可以使用此方法从我的rake任务访问它?

1 个答案:

答案 0 :(得分:1)

Twilio开发者传道者在这里。

在我看来,你拥有所需的所有部件。如果send_daily_sms类中的User是一种方法,则您需要的只是一个rake任务,如下所示:

task :sms_sender_daily => :environment do |_, args|
  User.find_each do |user|
    user.send_daily_sms if user.daily == true
  end
end

然后你的schedule.rb看起来像:

every :day, :at => '12pm' do    
  rake "email_sender_daily"
  rake "sms_sender_daily"
end

我警告说,通过一种一遍又一遍地调用API的方法向所有用户发送短信有点脆弱。如果由于超时或其他错误而导致一条消息无法发送,则该任务将抛出错误而无法完成发送所有消息。

我建议工作人员使用后台队列发送电子邮件和短信,例如Rails的ActiveJob。如果您使用的是最新的Rails 4.2,那么您可以使用名为Textris的gem,其工作原理与ActionMailer类似,然后您可以定义UserTexter类,如下所示:

class UserTexter < Textris::Base
  default :from => YOUR_NUMBER

  def daily_sms(user)
    @user = user
    text :to => @user.phone_number
  end
end

然后你的任务看起来像这样:

task :email_sender_daily => :environment do |_, args|
  User.find_each do |user|
    UserMailer.daily_mail(user).deliver_later if user.daily == true
  end
end

task :sms_sender_daily => :environment do |_, args|
  User.find_each do |user|
    UserTexter.daily_sms(user).deliver_later if user.daily == true
  end
end

查看Textris文档,了解有关如何使用gem的更多信息。

请告诉我这是否有帮助!