ltrainpr
ltrainpr

Reputation: 3463

Solution to AbstractController::DoubleRenderError

I've built a volunteer tracking application with a phone-text user interface using the Twilio API. I don't need a view so my controller contains this code:

class TwilioController < ApplicationController
  include TwilioHelper

  def sms_receive
    user = User.find_or_create_by(phone_number: params[:From])
    text = Text.create(user_id: user.id, body: params[:Body].capitalize, date: DateTime.now)
    activity_log = ActivityLog.new(user_id: user.id, phone_number: "xxx-xxx-#{user.last_four_digits}", text_id: text.id)

    args = {user: user, text: text, activity_log: activity_log, options: params}

    volunteer_manager = VolunteerHandler.new(args)
    replies = volunteer_manager.process
    replies.each {|reply| text_response(reply, args[:options])}
  end

  def text_response(reply, args)
    account_sid = ENV['ACCOUNT_SID']
    auth_token = ENV['AUTH_TOKEN']
    client = Twilio::REST::Client.new account_sid, auth_token

    client.account.messages.create(:body => reply, :to => args[:From], :from => args[:To])
    render nothing: true and return
  end
end

A user will send a multi command string (i.e. 'In with American Red Cross'). In this case two commands will execute 'In' and 'with American Red Cross'. These commands return an array of strings such as ['Thank you for volunteering', 'Would you like the American Red Cross to keep in contact with you for future volunteering opportunities?']. This array is what local variable replies points to.

If I take off the render nothing:true and return code then I get the error: ActionView::MissingTemplate Missing template twilio/sms_receive I can create the unnecessary view and solve my problem, but this doesn't seem like the best solution.

Any and all help is greatly appreciated. Thank you.

Upvotes: 0

Views: 77

Answers (1)

RAJ
RAJ

Reputation: 9747

As replies is an array which is iterating over text_response its executing render nothing: true and return multiple times, which is cause of error you are facing.

Try getting render statement out of the loop.

class TwilioController < ApplicationController
  include TwilioHelper

  def sms_receive
    user = User.find_or_create_by(phone_number: params[:From])
    text = Text.create(user_id: user.id, body: params[:Body].capitalize, date: DateTime.now)
    activity_log = ActivityLog.new(user_id: user.id, phone_number: "xxx-xxx-#{user.last_four_digits}", text_id: text.id)

    args = {user: user, text: text, activity_log: activity_log, options: params}

    volunteer_manager = VolunteerHandler.new(args)
    replies = volunteer_manager.process
    replies.each {|reply| text_response(reply, args[:options])}
    render nothing: true and return
  end


  def text_response(reply, args)
    account_sid = ENV['ACCOUNT_SID']
    auth_token = ENV['AUTH_TOKEN']
    client = Twilio::REST::Client.new account_sid, auth_token

    client.account.messages.create(:body => reply, :to => args[:From], :from => args[:To])
  end
end

Upvotes: 2

Related Questions