Rails4 - отображение предметов в форме заказов

Я хочу, чтобы пользователь просматривал существующие элементы из таблицы элементов в форме заказов, он работает для клиентов, но не для элементов, выдает ошибку: Ассоциация: элемент не найден

модели

class Order < ActiveRecord::Base
    belongs_to :user
    belongs_to :client

    has_many :order_items
    has_many :items, :through => :order_items
end

class Item < ActiveRecord::Base
    has_many :order_items
    has_many :orders, :through => :order_items
end

class OrderItem < ActiveRecord::Base
    belongs_to :item
    belongs_to :order
end

миграция

class CreateOrderItems < ActiveRecord::Migration
  def change
    create_table :order_items do |t|
        t.integer :item_id
        t.integer :order_id
      t.timestamps
    end
    add_index   :order_items, [:item_id, :order_id]
  end
end

Посмотреть

<%= simple_form_for(@order) do |f| %>
  <%= f.error_notification %>
    <%= f.association :client, collection: Client.all, label_method: :name, value_method: :id, prompt: "Choose a Client", input_html: { id: 'client-select2' } %>
    <%= f.association :item, collection: Item.all, label_method: :name, value_method: :id, prompt: "Choose an item", input_html: { id: 'client-select2' }  %>
<%= f.input :memo, label: 'Comments' %>
    <%= f.submit %>
<% end %>

контроллер

 def new
    @order = Order.new
  end

  def create
    @order = Order.new(order_params)
    @order.user_id = current_user.id
    @order.status = TRUE
  end
  def order_params
    params.require(:order).permit(:code, :client_id, :user_id, :memo, :status,    items_attributes: [:id, :name, :price, :quantity, :status, :_destroy])
  end

Ответ

В форме используйте вместо этого: используя rails-select2 gem

<%= f.association :items, collection: Item.all, label_method: :name, value_method: :id, prompt: "Choose an item", input_html: { id: 'item-select2' } %>

или без выбора2

<%= f.select :item_ids, Item.all.collect {|x| [x.name, x.id]}, {}, multiple: true %>

Благодаря JKen13579

1 ответ

Решение

Причина, по которой вы получаете сообщение об ошибке item но не для client потому что есть один client связан с заказом, но более одного item связано с заказом. Это говорит :item not found потому что вы должны использовать :items (обратите внимание на множественное число).

Чтобы разрешить множественный выбор для вашего order"s itemsзамени f.association item линия с:

<%= f.select :item_ids, Item.all.collect {|x| [x.name, x.id]}, {}, multiple: true %>

А потом в вашем контроллере обязательно разрешите item_ids, Кроме того, вам не нужно item_attributesпотому что вы не используете accepted_nested_attributes_for :items,

def order_params
  params.require(:order).permit(:code, :client_id, :user_id, :memo, :status, item_ids: [])
end

Смотрите этот SO ответ для получения дополнительной информации о has_many:through выбор из нескольких вариантов.

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