2017-05-07 29 views
0

我試圖將我的應用程序從phoenix 1.2更新到1.3。Phoenix 1.3使用通道插入數據

在我的頻道中,handle_in功能之一得到order_idfood_id創建OrderItem

changeset = order 
|> build_assoc(:order_items) 
|> Myapp.OrderItem.changeset(%{food_id: food.id, 
           price: food.price, 
           quantity: 1, 
           order_id: order.id, 
           created_date: time_now}) 

case Repo.insert(changeset) do 
    {:ok, order_item} -> 
    max_rounds = Repo.one!(from p in Myapp.OrderItem, where: p.order_id == ^order.id, select: max(p.round)) 
    Myapp.Order.changeset(order, %{total: order.total + (order_item.price * order_item.quantity), rounds: max_rounds}) |> Repo.insert_or_update 
end 

所以上面的代碼是從鳳凰1.2版應用程序,它的作用是,當用戶成功創建order_item,它更新order。它工作正常。

with {:ok, %OrderItem{} = order_item} <- Myapp.create_order_item(%{food_id: food.id, 
                     price: food.price,                                
                     order_id: order.id, 
                     created_date: time_now}) do  

max_rounds = Repo.one!(from p in OrderItem, where: p.restaurant_order_id == ^order.id, select: max(p.round)) 
Myapp.update_order(order, %{total: order.total + (order_item.price * order_item.quantity), rounds: max_rounds}) 
end 

鳳凰1.3引入了新的使用model,所以我稱之爲create_order_item功能從Myapp具有Myapp.OrderMyapp.OrderItem創建order_item

def create_order_item(attrs \\ %{}) do 
%OrderItem{} 
|> order_item_changeset(attrs) 
|> Repo.insert() 
end 

儘管我傳遞了所有需要插入到數據庫的字段,但它並沒有插入數據庫。我應該如何解決它?我在這裏做錯了什麼?

在此先感謝。

---編輯

def create_order_item(attrs \\ %{}) do 
time_now = Ecto.DateTime.cast! 
(:calendar.universal_time_to_local_time(:calendar.universal_time())) 
%OrderItem{created_date: time_now} 
|> order_item_changeset(attrs) 
|> Repo.insert() 
end 
+0

您是否在日誌中看到錯誤?還是整個代碼運行沒有錯誤,但沒有插入? – Dogbert

+0

它不會觸發任何錯誤,也不會插入任何內容。如果我刪除'create_order_item'函數中的'|> order_item_changeset(attrs)',它將僅插入默認字段值。 –

+0

create_order_item'返回什麼?嘗試'IO.inspect(Myapp.create_order_item(...))'。它必須返回一些錯誤。 – Dogbert

回答

1

你的字段的類型utc_datetime,但你傳遞一個Ecto.DateTime給它,它不能被鑄造成utc_datetime:相反

iex(1)> Ecto.Type.cast(:utc_datetime, Ecto.DateTime.utc()) 
:error 

,您可以直接通過Erlang日期時間元組返回:calendar.universal_time_to_local_time/1

time_now = :calendar.universal_time_to_local_time(:calendar.universal_time()) 

您也可以改爲只使用:calendar.local_time()這確實與上面相同:

time_now = :calendar.local_time() 

而且,你真的應該使用with時處理失敗的情況下,否則錯誤的情況下會被忽略,就像是被在這裏,直到我們在評論中計算出來:

with {:ok, %OrderItem{} = order_item} <- Myapp.create_order_item(...) do  
... 
else 
    {:error, error} -> 
    # handle error 
end