如何从Rufus Scheduler(在控制器中)内部的模型中调用方法,以便根据用户输入安排时间?轨道4



下面是场景。我正在使用Rails4和Rufus Scheduler制作一个应用程序,在未来的特定时间发送短信。到目前为止,如果我想通过点击按钮发送短信,我就可以使用短信了。我还可以在我自己的代码中设置的计时器上发送它们,比如下面的计时器,它允许我的消息在未来发送。基本上,我设置了计时器,当它熄灭时,它会调用我的方法发送短信。

这一切都很好,但我最不需要做的就是制作一个方法,接受用户输入,并将其放在日期/时间/时区所在的位置。在我的new.html.erb中,我已经接受了所有这些信息,但我不知道如何从那里获取并将其放入调度器操作中。

这项工作:

scheduler = Rufus::Scheduler.new
scheduler.at '2014-02-16 5:47 PM Pacific Time' do
@sms_message.send_text_message
end

这是我已经尝试过的,但没有成功。

这是模型。

class SmsMessage
include Mongoid::Document
include Mongoid::Timestamps
field :from, type: String
field :to, type: String
field :body, type: String
field :year, type: String
field :month, type: String
field :day, type: String
field :timehour, type: String
field :timeminute, type: String
field :timezone, type: String
field :ampm, type: String
belongs_to :user
def set_time
puts year + month + day + " " + timehour + timeminute + " " + ampm + " " + timezone 
end

def send_text_message
ts = self.user.twilio_sid
tt = self.user.twilio_token
sent_to_number = to
sent_from_number = self.user.twilio_number
message_to_send = body
@twilio_client ||= Twilio::REST::Client.new ts, tt
@twilio_client.account.sms.messages.create(
:from => "#{sent_from_number}",
:to => "#{sent_to_number}",
:body => "#{message_to_send}"
)
end
end

这是控制器。

def create   
if current_user
@sms_message = current_user.sms_messages.build(params[:sms_message].permit(:to, :from, :body))
if @sms_message.save
scheduler = Rufus::Scheduler.new
scheduler.at @sms_message.set_time do
@sms_message.send_text_message
end
flash[:notice] = "Your text has been scheduled!"
redirect_to sms_messages_path
else
render 'new'
end
else new_user
redirect_to new_user_path
end

结束

和观点:

<div class="row">
<div class="col-md-3"></div>
<div class="col-md-6">
<%= form_for(@sms_message) do |f| %>
To: <%= f.text_field :to, class: "form-control" %>
Body: <%= f.text_area :body, class: "form-control" %><br />
<%= f.select :month, ['01-', '02-', '03-','04-',
'05-', '06-', '07-', '08-', '09-', '10-', '11-', '12-'] %>
<%= f.select :day, ['1', '2', '3', '4', '5', '6', '7', '8', '9',
'10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23',
'24', '25', '26', '27', '28', '29', '30', '31'] %>
<%= f.select :year, ['2014-', '2015-', '2016-', '2017-'] %>
at <%= f.select :timehour, ['1:', '2:', '3:', '4:', '5:', '6:', '7:', '8:', '9:',
'10:', '11:', '12:']%>
<%= f.select :timeminute, ['01', '02', '03', '04', '05', '06', '07', '08', '09', '10',
'11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23', '24',
'25', '26', '27', '28', '29', '30', '31', '32', '33', '34', '35', '36', '37', '38',
'39', '40', '41', '42', '43', '44', '45', '46', '47', '48', '49', '50', '51', '52',
'53', '54', '55', '56', '57', '58', '59', '60'] %>
<%= f.select :ampm, ['AM', 'PM'] %>
<%= f.select :timezone, ['Pacific Time', 'Eastern Time', 'Central Time',
'Mountain Time', 'Alaska Time', 'Hawaii-Aleutian Time', 'Samoa Time'] %><br /><br /><br />
<%= f.submit "Send Text Message", class: "btn btn-success"  %>
<% end %>
</div>
<div class="col-md-3"></div>

我已经尝试破解这个3个多小时了,但没有成功。我是Rails的初学者,如果这个问题的格式不完美,我很抱歉。还在学习。当我使用"-"、"+"one_answers"时,我的方法不断出错。所以我把这些东西放在视野里。这就是为什么它看起来很奇怪。你们觉得怎么样?

app/model/sms_message.rb

set_time函数更改为:

def set_time
year + month + day + " " + timehour + timeminute + " " + ampm + " " + timezone 
end

这将return字符串,而不是print字符串。

应用程序/controllers/sms_message_controller.rb中添加:

def create   
if current_user
@sms_message = current_user.sms_messages.build(sms_message_params)
if @sms_message.save
scheduler = Rufus::Scheduler.new
scheduler.at @sms_message.set_time do
@sms_message.send_text_message
end
flash[:notice] = "Your text has been scheduled!"
redirect_to sms_messages_path
else
render 'new'
end
else new_user
redirect_to new_user_path
end
private
def sms_message_params
params.require(:sms_message).permit(:from, :to, :body, :month, :day, :year, :timehour, :timeminute, :ampm, :timezone)
end

您不应该为每个用户请求创建一个新的rufus调度程序实例。您最终会得到无数的rufus调度程序线程,这些线程只使用过一次,却白白占用了内存和cpu。

更好的方法是:

a) 在初始化器中一次性启动调度器(例如config/initializers/scheduler.rb)

b) 根据需要从调度器实例中的控制器调度。

所以

config/ininitializers/scheduler.rb:

require 'rufus-scheduler'
$scheduler = Rufus::Scheduler.new

在您的控制器中:

def create
if current_user
@sms_message = current_user.sms_messages.build(params[:sms_message].permit(:to, :from, :body))
if @sms_message.save
$scheduler.at @sms_message.set_time do
@sms_message.send_text_message
end
flash[:notice] = "Your text has been scheduled!"
redirect_to sms_messages_path
else
render 'new'
end
else new_user
redirect_to new_user_path
end
end

警告

最后,这一切都取决于你在什么"服务器"上运行Rails。Thin和Webrick应该没问题。如果你使用Passenger或其他服务器,你必须仔细阅读文档。其中一些服务器分叉Ruby进程,原始进程(托管您初始化的rufus调度程序线程的进程)可能无法生存,从而丢失所有调度。阅读工具附带的精美手册。

最新更新