2014-10-31 82 views
0

我有一个简单的应用程序,我想确认订单从我的客户反对通过短信购买。我将会话变量中的订单ID传递给我,他将分别响应y或n来接受或拒绝订单。我的代码是一些这样的事twilio会话变量不返回值

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为什么任何一个可以帮助这个或建议我怎么可以把订单ID在params。

回答

0

会话是空的,因为(我猜)它是通用处理程序。你应该通过orderId客户:

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

现在,你应该能够内

order = Order.find params['OrderId'] 

希望它可以帮助恢复。

+0

感谢您的回复。我试过这个,但我认为我们不能通过这种方式将参数传递给twilio api。 – 2014-10-31 13:54:03

1

我是Twilio的开发者宣传员。

您的问题在于,当用户使用网络浏览器浏览您的网站时,会话可以正常工作。每次浏览器发出请求时,Cookie都会标识会话并与服务器共享。

在这种情况下,您没有浏览器与网站进行交互,您的用户正在通过短信进行交互。所以,没有交换cookies,也不能有持续的会话。

相反,您需要将订单保存在更永久的商店中,例如另一个型号。我现在要称它为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的一个简单的数据库只有一个选项。

我希望这可以帮助,请让我知道,如果我可以进一步帮助。

+0

非常感谢您的回复,但在这种情况下,我的系统会表现出意外情况,例如,同一客户和偏离客户的产品的多次访客订单将获得每个订单的短信,并且如果客户接受订单,它将始终接受客户的最后订单,我希望你明白我的观点。 – 2014-10-31 13:42:52

+0

我明白你的观点,但会议仍不会按照你的预期工作。您可能可能需要用户输入他们正在购买的订单的编号并在SMS中检测到该编号,但这会使其比“是/否”响应更难。事情是,将SMS对话连接起来比在基于Web的交互过程中保留状态更难。 – philnash 2014-10-31 14:47:53

+0

目前我在做同样的事情让订单id回到短信让我们随你的解决方案。但是,如果您有任何其他解决方案,请让我知道谢谢 – 2014-11-01 04:54:28