Рубин на рельсах Общая ошибка: отсутствуют параметры?

Я строю систему управления заказами. Недавно я опубликовал проблему о добавлении заказа клиенту. Кажется, я исправил это на 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 повторно заполнить форму (в том же контексте) данными, которые присутствовали во время неудачной отправки.

Другие вопросы по тегам