Недопустимый параметр в отношении HABTM - PullRequest
0 голосов
/ 09 февраля 2019

Итак, я строю отношения HABTM и всегда получаю эту ошибку обратно в терминал при отправке формы:

Unpermitted parameter: :color_ids

Других ошибок нет.Приложение работает нормально, за исключением того, что ассоциации всегда являются пустым массивом.

Schema.rb:

create_table "colors", force: :cascade do |t|
  t.string "color"
  t.datetime "created_at", null: false
  t.datetime "updated_at", null: false
end

create_table "colors_products", id: false, force: :cascade do |t|
  t.integer "color_id", null: false
  t.integer "product_id", null: false
end

create_table "products", force: :cascade do |t|
  t.string "title"
  t.decimal "price"
  t.datetime "created_at", null: false
  t.datetime "updated_at", null: false
end

color.rb:

class Color < ApplicationRecord
  has_and_belongs_to_many :products
end

product.rb:

class Product < ApplicationRecord
  has_and_belongs_to_many :colors
end

_form.html.erb:

<div class="field">
  <%= form.label :color %>
  <%= form.collection_select  :color_ids, Color.all, :id, :color, {:multiple => true}, class: "input-field-data" %>
</div>

product_controller.rb

def product_params
  params.require(:product).permit(:title, :price, color_ids: [])
end

изменение хэша параметра с идентификаторов цветов на color_ids:[:id, :color] не имеет значения.

Этот пример, очевидно, простовоссоздав, чтобы увидеть, сделал ли я что-то еще не так в своем исходном приложении, возможно, его также легче отладить.

Есть идеи, что не так с этой настройкой?У меня фактически есть другой проект с точно такой же настройкой, и он работает?Из-за этого я думаю, что что-то упустил, но на самом деле я не нахожу ничего плохого в своем коде.

Заранее благодарен за любой ввод!

Редактировать:

Как и было запрошено, вот журнал терминала при отправке нового продукта с collection_select, как показано выше:

Started POST "/products" for 127.0.0.1 at 2019-02-10 14:02:59 +0100
Processing by ProductsController#create as HTML
  Parameters: {"authenticity_token"=>"+f+GJaN58M029eGICvMqlwtjYB4Qmv/KNBY0OnymrxyFy+zNYXKfZtCXR0NM3kLY16QIzfLb+takhNjgIQXeEw==", "product"=>{"title"=>"abc", "price"=>"9.99", "color_ids"=>"1"}, "commit"=>"Create Product"}
Unpermitted parameter: :color_ids
   (0.1ms)  begin transaction
  ↳ app/controllers/products_controller.rb:30:in `block in create'
  Product Create (1.0ms)  INSERT INTO "products" ("title", "price", "created_at", "updated_at") VALUES (?, ?, ?, ?)  [["title", "abc"], ["price", 9.99], ["created_at", "2019-02-10 13:02:59.634965"], ["updated_at", "2019-02-10 13:02:59.634965"]]
  ↳ app/controllers/products_controller.rb:30:in `block in create'
   (1.1ms)  commit transaction
  ↳ app/controllers/products_controller.rb:30:in `block in create'
Redirected to http://localhost:3000/products/15
Completed 302 Found in 14ms (ActiveRecord: 2.3ms | Allocations: 3885)


Started GET "/products/15" for 127.0.0.1 at 2019-02-10 14:02:59 +0100
Processing by ProductsController#show as HTML
  Parameters: {"id"=>"15"}
  Product Load (0.4ms)  SELECT "products".* FROM "products" WHERE "products"."id" = ? LIMIT ?  [["id", 15], ["LIMIT", 1]]
  ↳ app/controllers/products_controller.rb:67:in `set_product'
  Rendering products/show.html.erb within layouts/application
  Rendered products/show.html.erb within layouts/application (Duration: 1.1ms | Allocations: 302)
Completed 200 OK in 23ms (Views: 16.0ms | ActiveRecord: 0.4ms | Allocations: 8945)

Также:

Отправка через консоль rails работает нормально, так что этоопределенно что-то делать с формой, которую я предполагаю:

irb(main):010:0> p = Product.last

=> #<Product id: 15, title: "abc", price: 0.999e1, created_at: "2019-02-10 13:02:59", updated_at: "2019-02-10 13:02:59">

irb(main):011:0> p.colors

=> #<ActiveRecord::Associations::CollectionProxy []>

irb(main):012:0> p.colors << [Color.last]

=> #<ActiveRecord::Associations::CollectionProxy [#<Color id: 2, col: "Red", created_at: "2019-02-10 09:04:42", updated_at: "2019-02-10 09:04:42">]>

irb(main):013:0> p.colors

=> #<ActiveRecord::Associations::CollectionProxy [#<Color id: 2, col: "Red", created_at: "2019-02-10 09:04:42", updated_at: "2019-02-10 09:04:42">]>

_form.html.erb (генерируется скаффолдом и настраивается с помощью поля collection_select)

<%= form_with(model: product, local: true) do |form| %>
  <% if product.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(product.errors.count, "error") %> prohibited this product from being saved:</h2>

      <ul>
      <% product.errors.full_messages.each do |message| %>
        <li><%= message %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

  <div class="field">
    <%= form.label :title %>
    <%= form.text_field :title %>
  </div>

  <div class="field">
    <%= form.label :price %>
    <%= form.text_field :price %>
  </div>

  <div class="field">
    <%= form.label :color_ids %>
    <%= form.collection_select( :color_ids,  Color.all, :id, :col, {multiple: true}) %>
  </div>

  <div class="actions">
    <%= form.submit %>
  </div>
<% end %>

Привет!

1 Ответ

0 голосов
/ 10 февраля 2019

Вы ожидаете массив / хэш, но вы получаете одну строку.Похоже, что помощник не создает множественный выбор, вы видите атрибут multiple="true" в теге выбора?Если нет, попробуйте изменить метод следующим образом:

form.collection_select( :color_ids,  Color.all, :id, :col, {}, {multiple: true})

Обратите внимание на дополнительные {}.Помощник ожидает, что первый хеш будет опциями для помощника, а второй хэш будет опциями для тега.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...