protocol Enumerable не реализован для nil (феникс-фреймворк)

56
3

Я добавил функцию "платеж" в контроллер заказа и добавил маршрут для этого.

def payment(conn, %{"id" => id}) do
foods = Repo.all(Food)
order =
Repo.get!(assoc(conn.assigns[:table], :orders), id)
|> Repo.preload(order_items: :food)
order_item_changeset =
order
|> build_assoc(:order_items)
|> Pos1.OrderItem.changeset()
order_changeset = Order.changeset(order)

render(conn, "payment.html", order: order, order_item_changeset: order_item_changeset, order_changeset: order_changeset, foods: foods, payment: @payment)
end

resources "/tables", TableController do
resources "/orders", OrderController do
get "/payment", OrderController, :payment
end

Я добавил маршрут для оплаты по таблице и заказу, потому что оплата должна показывать номер своей таблицы и идентификатор заказа. И я добавил ссылку на страницу оплаты в show.html шаблона заказа. Однако он вызывает Protocol.UndefinedError.

[error] #PID<0.9096.0> running Pos1.Endpoint terminated
Server: localhost:4000 (http)
Request: GET /tables/1/orders/14
** (exit) an exception was raised:
** (Protocol.UndefinedError) protocol Enumerable not implemented for nil
(elixir) lib/enum.ex:1: Enumerable.impl_for!/1
(elixir) lib/enum.ex:116: Enumerable.reduce/3
(elixir) lib/enum.ex:1486: Enum.reduce/3
(pos1) Pos1.Router.Helpers.segments/3
(pos1) web/router.ex:1: Pos1.Router.Helpers.table_order_order_path/5
(pos1) web/templates/order/show.html.eex:59: Pos1.OrderView."show.html"/1
(pos1) web/templates/layout/app.html.eex:41: Pos1.LayoutView."app.html"/1
(phoenix) lib/phoenix/view.ex:344: Phoenix.View.render_to_iodata/3
(phoenix) lib/phoenix/controller.ex:633: Phoenix.Controller.do_render/4
(pos1) web/controllers/order_controller.ex:1: Pos1.OrderController.action/2
(pos1) web/controllers/order_controller.ex:1: Pos1.OrderController.phoenix_controller_pipeline/2
(pos1) lib/phoenix/router.ex:261: Pos1.Router.dispatch/2
(pos1) web/router.ex:1: Pos1.Router.do_call/2
(pos1) lib/pos1/endpoint.ex:1: Pos1.Endpoint.phoenix_pipeline/1
(pos1) lib/plug/debugger.ex:93: Pos1.Endpoint."call (overridable 3)"/2
(pos1) lib/phoenix/endpoint/render_errors.ex:34: Pos1.Endpoint.call/2
(plug) lib/plug/adapters/cowboy/handler.ex:15: Plug.Adapters.Cowboy.Handler.upgrade/4
(cowboy) src/cowboy_protocol.erl:442: :cowboy_protocol.execute/4

Как я могу это решить? Должен ли я использовать другой подход для определения оплаты функций?

Это код из web/templates/order/show.html.eex: 59

 <%= link "Confirm orders", to: table_order_order_path(@conn, :payment, @table, @order, @payment) %> 

<%= if @payment do %>
<%= link "Confirm orders", to: table_order_order_path(@conn, :payment, @table, @order, @payment) %>
<% end %>

спросил(а) 2016-05-20T13:40:00+03:00 4 года, 4 месяца назад
1
Решение
106

Протокол ошибки protocol Enumerable not implemented for nil означает, что вы передаете nil где-нибудь, где должен использоваться список или перечисляемый.

Если вы посмотрите вниз на стек, вы увидите, что это: Pos1.Router.Helpers.table_order_order_path/5 Путь заказа, вероятно, имеет порядок или идентификатор заказа, который является NULL в базе данных. Вы можете просто попробовать распечатать order и order_item_changeset в контроллере, чтобы узнать, какой из них проблематичен.

Если вы посмотрите немного ниже, это говорит о том, что ваша проблема кроется в шаблоне: web/templates/order/show.html.eex:59. Попробуйте это в своем шаблоне:

<%= if @order do %> #or whichever value is nil
your code here
<% end %>

ответил(а) 2016-05-20T15:58:00+03:00 4 года, 4 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема