2015-05-18 2 views
2

Можно ли добавить дополнительные атрибуты для соединения таблицы при заполнении формы с помощью collection_check_boxes в рельсах или мне нужно заполнить форму другим способом?Передача дополнительных атрибутов для соединения таблицы при заполнении формы с помощью collection_check_boxes в рельсах?

В настоящее время у меня есть модели продуктов, пакетов и моделей PackageItem. Пакеты содержат много продуктов, но могут также иметь несколько экземпляров каждого продукта в пакете (например, в пакете могут быть две вертушки). В моей форме я имею:

<%= f.collection_check_boxes :product_ids, Product.all, :id, :name, {}, { :multiple => true } %> 

и в моем контроллере пакетов я позволяю product_ids => [] в сильном Params. Соединение успешно создается с двумя внешними ключами в таблице package_items, однако есть еще один столбец number, где я хочу сохранить номер каждого продукта в пакете. Можно ли это сделать с помощью collection_check_boxes или мне нужно создать свою форму по-другому?

+0

Удалось ли вам получить его работу? Если да, можете ли вы опубликовать свой ответ? – Victor

+0

Привет, Vitor Я добавил ответ на то, как я продолжал (он не отвечает на точный вопрос, который я задал, но был лучшим решением для меня в конце). Надеюсь, это даст вам достаточно, чтобы продолжить. Если что-то неясно/нуждается в дальнейшем объяснении, пожалуйста, дайте мне знать. – rorykoehler

ответ

0

В соответствии с запросом, я решил эту проблему (используя поле ввода номера).

Соответствующий раздел формы:

<div id="package_products" class="col-xs-8"> 
    <% @products.each do |product| %> 
    <div class="col-xs-4 field"> 
     <%= hidden_field_tag 'product[][id]', product.id %> 
     <%= label_tag 'product[][name]', product.name %> 
     <%= number_field_tag 'product[][quantity]', {}, id: "product_" + product.id.to_s %> 
    </div> 
    <% end %> 
</div> 

И мой код пакетов управления (обратите внимание, я вручную заполнить поля, чтобы иметь возможность добавить не присоединиться Params ... не уверен, если есть больше рельсов способ сделать это?). Также не уверен в безопасности моего решения, так как я не включил product[:quantity] в сильные параметры в частном разделе в нижней части контроллера (не могу вспомнить мой разумный). Теоретически это означает, что кто-то может вставлять вредоносный код в db, но это очень маловероятно, поскольку это целое поле, и оно было доступно только для администраторов, которые саботировали бы себя. Если вы отпускаете потребительское приложение в дикой природе я бы перепроверить потенциальные последствия этого:

def create 
    @package = Package.new(package_params) 
    @package_items = params[:product].delete_if { |product| !product[:quantity].present? || (product[:quantity]).to_i <= 0} 
    if @package.save 
     @package_items.each do |x| 
     packageitem = PackageItem.create(package_id: @package.id, product_id: x['id'], quantity: x['quantity']) 
     packageitem.save! 
     end 
     respond_to do |format| 
      flash.now[:notice] = "Package was successfully created!" 
      format.html { redirect_to packages_path } 
      format.json { head :no_content } 
      format.js 
     end 
    end 
    end 



private 

    def set_products 
     @products = Product.all 
    end 

    def package_params 
     params.require(:package).permit(:name, :price, :package_image, :multiple_day_discount) 
    end 

И модель/package_item.rb

class PackageItem < ActiveRecord::Base 
    belongs_to :package 
    belongs_to :product 
end 
Смежные вопросы