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
выбор из нескольких вариантов.