Рубин на рельсах Общая ошибка: отсутствуют параметры?
Я строю систему управления заказами. Недавно я опубликовал проблему о добавлении заказа клиенту. Кажется, я исправил это на 99%. если я смотрю в свой терминал, он сначала находит текущий идентификатор клиента, а затем создает новый заказ. Следующий результат есть.
Customer Load (0.2ms) SELECT "customers".* FROM "customers" WHERE "customers"."id" = ? LIMIT 1 [["id", 111]]
(0.1ms) begin transaction
SQL (0.4ms) INSERT INTO "orders" ("customer_id", "created_at", "updated_at") VALUES (?, ?, ?) [["customer_id", 111], ["created_at", "2015-11-12 13:28:21.185604"], ["updated_at", "2015-11-12 13:28:21.185604"]]
(8.2ms) commit transaction
Но проблема в том, что он не добавляет параметры. Я сделал это намеренно, просто чтобы проверить, будет ли мой синтаксис выполнять следующую инструкцию sql. Но как только я добавляю params, я получаю общую ошибку: "param отсутствует или значение пусто: order"
Вот мой код:
контроллер
def createorders
@customer = Customer.find(params[:id]) #find current id??
#current_user = Order.find(params[:id])
@orders = @customer.orders.new(order_params)
if @orders.save
flash[:notice] = "Subject created successfully"
redirect_to(:action => 'index')
else
#If save fails, redisplay the form so user can fix problems
render('new') #het zit in de new.html template
end
end
private
def order_params
#same as using "params[:subject]", expect that it:
# - raises an error if :subject is not present
# - allows listed attributes to be mass-assigned
params.require(:order).permit(:pakket, :verstuurt)
end
end
Посмотреть
<%= link_to("<< Back to List", {:action => 'index'}, :class => 'back-link') %>
<div class="subject new">
<h2>Create Subject</h2>
<%= form_for(:order, :url=> {:action => 'createorders'}) do |f| %>
<table summary="subject form fields">
<tr>
<th>pakket</th>
<td><%= f.text_field(:pakket) %></td>
</tr>
<tr>
<th>verstuurt</th>
<td><%= f.text_field(:verstuurt) %></td>
</tr>
</table>
<div class="form-buttons">
<%= submit_tag("Create Subject") %>
</div>
<% end %>
</div>
Сообщение об ошибке
ActionController::ParameterMissing в OrderController# параметр createorders отсутствует или значение пусто: порядок
Extracted source (around line #107): 105 106 107 108 109 110 def order_params params.require(:order).permit(:pakket, :verstuurt) end end
Журнал на стороне сервера
Запущено GET "/order/createorders? Id=111" для::1 в 2015-11-13 11:58:30 +0100 Обработка OrderController#createorders как HTML
Параметры: {"id"=>"111"} Клиентская нагрузка (0,2 мс) ВЫБЕРИТЕ "клиенты".* ИЗ "клиентов" ГДЕ "клиенты"."Id" =? LIMIT 1 [["id", 111]] Выполнено 400 неверных запросов за 5 мс (ActiveRecord: 0,2 мс)ActionController::ParameterMissing (param is missing or the value is empty: order): app/controllers/order_controller.rb:107:in
order_params' app/controllers/order_controller.rb:44:in
createorders'Rendered /Users/cecil/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/actionpack-4.2.4/lib/action_dispatch/middleware/templates/rescues/_source.erb
(8,3 мс.) Предоставлено /Users/cecil/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/actionpack-4.2.4/lib/action_dispatch/middleware/templates/rescues/_trace.html.erb (2,6 мс) отображается /Users/cecil/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/actionpack-4.2.4/lib/action_dispatch/middleware/templates/rescues/_request_and_response.html.erb (1,3 мс) отображается /Users/cecil/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/actionpack-4.2.4/lib/action_dispatch/middleware/templates/rescues/diagnostics.html.erb в пределах rescues/layout (68,2 мс), обработано /Users/cecil/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/web-console-2.2.1/lib/web_console/templates/_markup.html.erb (0,4 мс) отображается /Users/cecil/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/web-console-2.2.1/lib/web_console/templates/_inner_console_markup.html.erb в макетах /inlined_string (0,4 мсек) /Users/cecil/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/web-console-2.2.1/lib/web_console/templates/_prompt_box_markup.html.erb в Layouts/inlined_string (0,4ms) отображается /Users/cecil/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/web-console-2.2.1/lib/web_console/templates/style.css.erb в макетах /inlined_string (0,4 мс) отображается /Users/cecil/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/web-console-2.2.1/lib/web_console/ Шаблоны /console.js.erb в макетах /javascript (60,3 мс) отображаются /Users/cecil/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/web-console-2.2.1/lib/web_console/templates/main.js.erb в макетах /javascript (0,3 мс) отображается /Users/cecil/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/web-console-2.2.1/lib/web_console/templates/error_page.js.erb в макетах /javascript (0,5 мс) отображается /Users/cecil/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/web-console-2.2.1/lib/web_console/templates/index.html.erb (124,2 мс)
Спасибо stackru за поддержку Я новичок в ruby, и я понимаю, что я делаю noob ошибки. Так что указывающие на недостатки приветствуются!
1 ответ
Я игнорировал ваши второстепенные, несмертельные проблемы раньше, когда сосредоточился на поиске основной проблемы, но теперь я включу их, когда основная проблема очевидна.
Во-первых, я немного расскажу об именах Rails. У вас есть две модели, которые названы Customer
а также Order
, Вы использовали единственную форму существительного для них, и это хорошо. Каждый экземпляр модели - это одно, поэтому он должен быть единичным. Ваш контроллер для Order
модель действий, однако, должна быть названа во множественном числе, поэтому она должна называться OrdersController
, Это потому, что он контролирует действия, связанные со всеми вашими заказами. Это приводит нас к вашему createorders
действие, которое было бы немного больше смысла, если бы оно было названо createorder
, поскольку он создает только один Order
, На самом деле, соглашение заключается в том, чтобы назвать это действие create
, Действие в вашем OrdersController
поэтому мы уже предполагаем, что это имеет дело с Order
пример. (Если у вас есть Rails, автоматически генерируйте маршруты REST-ful для контроллера модели с resources
функция, она предполагает, что у вас есть действие с именем create
.) Наконец, в вашем create
метод, новый Order
экземпляр, на который будут ссылаться, по вашему мнению, должен называться @order
вместо @orders
, поскольку он содержит только один Order
,
Теперь все становится немного сложнее. Ваш param is missing
ошибка означает именно это. Параметры для нового Order
экземпляр отсутствует. Запрос к серверу, который производит эту ошибку, является GET
запрос, который имеет только один параметр, который вы предоставляете в своем URL с ?id=111
, Данные вашей формы не передаются на сервер с этим GET
запрос. Вы должны делать POST
запрос на создание нового Order
, Я собираюсь избежать дальнейшего изучения (и предположений, не видя вашего полного кода) относительно того, почему сейчас все не работает, и я просто предложу некоторые ключевые корректировки. Это превращается в небольшую головоломку, чтобы понять, как работает ваше приложение, не видя все части.
В route.rb у вас должна быть эта строка:
resources :customers, :orders
Я внес минимальные изменения в предоставленное вами представление, которое, как я предполагаю, называется show.html.erb и находится в вашей папке app/views/ Customers:
<%= link_to("<< Back to List", {:action => 'index'}, :class => 'back-link') %>
<div class="subject new">
<h2>Create Subject</h2>
<%= form_for @order do |f| %>
<table summary="subject form fields">
<tr>
<th>pakket</th>
<td><%= f.text_field(:pakket) %></td>
</tr>
<tr>
<th>verstuurt</th>
<td><%= f.text_field(:verstuurt) %></td>
</tr>
</table>
<%= f.hidden_field :customer_id %>
<div class="form-buttons">
<%= submit_tag("Create Subject") %>
</div>
<% end %>
</div>
Вот необходимый код из Customers_controller.rb для его поддержки:
def show
customer = Customer.find params[:id]
@order = customer.orders.new
end
Обратите внимание, в представлении, параметр для form_for
это экземпляр, который был создан в контроллере. Кроме того, я добавил скрытое поле для отправки customer_id
с новым Order
данные.
Наконец, ваш create
действие в orders_controller.rb может выглядеть так:
def create
@order = Order.new(order_params)
if @order.save
flash[:notice] = "Subject created successfully"
redirect_to(:action => 'index')
else
render 'customers/show'
end
end
И ваш order_params
метод должен быть изменен, чтобы включить customer_id
параметр:
def order_params
params.require(:order).permit(:pakket, :verstuurt, :customer_id)
end
Обратите внимание, что на не удалось save
, действие оказывает customers/show
, потому что это страница, на которой они находились, где сохранение не удалось. Это позволит Rails повторно заполнить форму (в том же контексте) данными, которые присутствовали во время неудачной отправки.