2014-10-31 128 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