Как я могу вызвать метод из модели внутри Планировщика Руфуса (в контроллере), чтобы время планировалось на основе пользовательского ввода? Рельсы 4

Итак, вот сценарий. Я использую Rails 4 и Rufus Scheduler для создания приложения, которое отправляет SMS в определенное время в будущем. До сих пор я получил SMS для работы, если я хочу отправить SMS одним нажатием кнопки. И я также могу отправлять их по таймеру, который я установил в своем собственном коде, таком как приведенный ниже, который позволяет отправлять мое сообщение в будущем. По сути, я установил таймер, и когда он отключается, он вызывает мой метод для отправки SMS-сообщения.

Это все замечательно, но последнее, что мне нужно сделать, - это создать метод, который принимает пользовательский ввод и помещает его в то место, где находятся дата / время / часовой пояс. В моем 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, поэтому заранее извиняюсь, если этот вопрос не отформатирован идеально. Все еще изучаю. Я продолжал получать ошибки с моим методом, когда я использовал "-", "+" и " ". Так что я положил эти вещи в поле зрения. Вот почему это выглядит странно. Что, вы парни, думаете?

2 ответа

Решение

В приложении / модель /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-scheduler для каждого пользовательского запроса. Вы получите множество потоков rufus-scheduler, которые были полезны только один раз и израсходовали память и процессор на пустые места.

Лучшим способом было бы:

а) запустить планировщик раз и навсегда в инициализаторе (например, config/initializers/scheduler.rb)

б) график от контроллера в экземпляре планировщика по мере необходимости.

так

конфиг / Инициализаторы /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. Тонкий и Уэбрик должен быть в порядке. Если вы пользуетесь Passenger или другим сервером, вам придется внимательно прочитать документ. Некоторые из этих серверов разветвляют процесс Ruby, первоначальный процесс (тот, который содержит инициализированный вами поток rufus-scheduler) может не сохраниться, потеряв все расписания. Прочитайте хорошие руководства, которые идут с Вашими инструментами.

Другие вопросы по тегам