twilio会话变量不返回值

时间:2014-10-31 12:15:19

标签: ruby-on-rails ruby ruby-on-rails-4 twilio

我有一个简单的应用程序,我想确认客户的订单与短信购买。我将会话变量中的订单ID传递给我,他将使用y或n来响应,分别接受或拒绝订单。我的代码是这样的东西

body = "You have a new order of a #{product.title}"
session[:orderId] = @order.id
client = Twilio::REST::Client.new(ACCOUNT_SID, AUTH_TOKEN)
client.account.messages.create(:from => 'myNo', :to => sotre_no, :body => body)

并通过

获得回复
from = params["From"]
response = params["Body"]
order = Order.find session[:orderId] #session[:orderId] returns nil why?
if order.confirm(response)
  body = "your order is confirmed! Thanks"
else
  body = "You have reject the order Thanks for your response"
end
client = Twilio::REST::Client.new(ACCOUNT_SID, AUTH_TOKEN)
client.account.messages.create(:from => 'myNo', :to => from, :body => body)

我无法获得订单ID为什么任何人可以提供帮助或建议我如何在params中发送订单ID。

2 个答案:

答案 0 :(得分:1)

我是Twilio的开发人员传播者。

您的问题是当用户使用网络浏览器浏览您的网站时会话有效。 Cookie标识会话,并在每次浏览器发出请求时与服务器共享。

在这种情况下,您没有与该网站交互的浏览器,您的用户正在通过SMS进行交互。因此,没有cookie被交换,也不会有持久的会话。

相反,您需要将订单保存在更长久的商店中,例如另一个模型。我现在打算称它为Offer(即您向用户提供产品)。

class Offer < ActiveRecord::Base
  belongs_to :user
  belongs_to :order

  def self.last_offer_for(phone_number)
    self.include(:user).where(['users.phone_number = ?', phone_number]).first
  end
end

然后,您最初发送的短信将如下所示:

body = "You have a new order of a #{product.title}"
Offer.create(:order => @order, :user => @user)
client = Twilio::REST::Client.new(ACCOUNT_SID, AUTH_TOKEN)
client.account.messages.create(:from => 'myNo', :to => @user.phone_number, :body => body)

当您收到回复的消息时,您将通过电话号码查找您向用户提出的最后一个优惠,并从那里获取订单:

from = params["From"]
response = params["Body"]
offer = Offer.last_offer_for(from)
order = offer.order
if order.confirm(response)
  body = "your order is confirmed! Thanks"
else
  body = "You have reject the order Thanks for your response"
end
client = Twilio::REST::Client.new(ACCOUNT_SID, AUTH_TOKEN)
client.account.messages.create(:from => 'myNo', :to => from, :body => body)

这只是如何执行此操作的一个选项,您可以将其保存在更简单的数据库中,例如像redis这样的键值存储。

我希望这会有所帮助,如果我能继续提供帮助,请告诉我。

答案 1 :(得分:0)

会话是空的,因为(我猜)它是通用处理程序。您应该将orderId传递给客户:

client.account.messages.create(
  :from => 'myNo', 
  :to => sotre_no, 
  :body => body,
  :orderId => @order.id # supply orderId
)

现在你应该能够在

中检索它
order = Order.find params['OrderId']

希望它有所帮助。