form.fields_for делать для конечного числа раз - PullRequest
0 голосов
/ 22 октября 2010

У меня есть две модели, Product и ProductImage, и я хотел бы предложить возможность добавить до 6 изображений для каждого продукта.

Product

has_many :product_images, :dependent => :destroy

, в то время как ProductImage

belongs_to :product

Пока что мои взгляды таковы:

#products/_form.html.erb.
    <% @product.product_images.build %>
    <%= form_for(@product, :html => { :multipart => true }) do |product_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 |msg| %>
            <li><%= msg %></li>
          <% end %>
          </ul>
        </div>
      <% end %>

      <div class="field">
        <%= product_form.label :title %><br />
        <%= product_form.text_field :title %>
      </div>
      <div class="field">
        <%= product_form.label :description %><br />
        <%= product_form.text_area :description %>
      </div>
      <div class="field">
        <%= product_form.label :price %><br />
        <%= product_form.text_field :price %>
      </div>
      <div id="product_images">
          <%= render :partial => 'product_images/form', :locals => {:form => product_form} %> 
        </div>
      <div class="actions">
        <%= product_form.submit %>
      </div>
    <% end %>

и

#product_images/_form.html.erb
    <%= form.fields_for :product_images do |product_image_form| %>
        <div class="image">
            <%= product_image_form.label :image, 'Image:' %>
            <%= product_image_form.file_field :image %>
        </div>
        <% unless product_image_form.object.nil? || product_image_form.object.new_record? %>
        <div class="image">
            <%= product_image_form.label :_destroy, 'Remove:' %>
            <%= product_image_form.check_box :_destroy %>
        </div>
        <% end %>
    <% end %> 

Вопрос: как заставить мою частичную форму распечатать6 различных файловых полей, каждое со своим уникальным именем атрибута, например:

name="product[product_images_attributes][0][image]"
name="product[product_images_attributes][1][image]"

и т. Д.

Я имею в виду, возможно ли это или есть лучший и иной способ достижениятакой результат?

Я думал, что мог бы добавить столько полей с link_to и AJAX, но я предполагаю, что для пользователя намного проще распечатать и подготовить шесть полей вместо того, чтобы щелкать ссылку каждый раз вДля добавления поля.

1 Ответ

2 голосов
/ 22 октября 2010

Если вы используете accepts_nested_attributes_for :product_images в своей модели продукта, вам нужно что-то вроде следующего в вашем ProdcutsController:

def new
  @product = Product.new
  6.times { @product.product_images.build } # this will create 6 "blank product_images"
end

def edit
  @product = Product.find(params[:id]).includes(:product_images)
  (6 - @product.product_images.size).times { @product.product_images.build } # this will create as many "blanks" as needed
end

Для новых продуктов вы build 6 новых изображений продуктов, для существующихbuild только столько, сколько вам нужно, чтобы иметь 6.

Редактировать: также удалите строку <% @product.product_images.build %> из вашего представления products / _form.html.erb, так как вы build связываете экземплярывместо этого в вашем контроллере.

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