Ajax, множественные вложения и скрепка вопрос - PullRequest
1 голос
/ 28 апреля 2010

Хорошо, это немного сложная настройка, поэтому, если мне нужно уточнить вопрос, просто дайте мне знать.

У меня есть модель:

class IconSet < ActiveRecord::Base
  has_many :icon_graphics
end

Эта модель имеет много иконографий:

class IconGraphic < ActiveRecord::Base
  belongs_to :icon_set
  has_attached_file :icon
  has_attached_file :flagged
end

Как видите, IconGraphic имеет два прикрепленных файла, в основном две разные версии иконки, которые я хочу загрузить.

Теперь эта настройка работает нормально, если я редактирую иконографию индивидуально, однако для простоты использования у меня есть вся иконка, редактируемая в IconSet. Когда вы редактируете набор иконок, форма загружает частичку для icongraphics:

<% form_for @icon_set, :html => {:class => 'nice', :multipart => true} do |f| %>
<fieldset>  
  <%= f.error_messages %>
  <p>
    <%= f.label :name %>
    <%= f.text_field :name, :class => "text_input" %>
  </p>
    <!-- Loaded Partial for icongraphics -->
    <div id="icon_graphics">
        <%= render :partial => 'icon_graphic', :collection => @icon_set.icon_graphics %>        
    </div>
    <div class="add_link">
    <%= link_to_function "Add an Icon" do |page|
        page.insert_html :bottom, :icon_graphics, :partial => 'icon_graphic', :object => IconGraphic.new
    end %>
    </div>
  <p><%= f.submit "Submit" %></p>
</fieldset>
<% end %>

Это в значительной степени основано на сложных формах Railscast Райана .

Частичная загрузка форм file_field:

<div class="icon_graphic">
<% fields_for "icon_set[icon_graphic_attributes][]", icon_graphic do |icon_form|-%>
    <%- if icon_graphic.new_record? -%>
        <strong>Upload Icon: </strong><%= icon_form.file_field :icon, :index => nil %><br/>
        <strong>Upload Flagged Icon: </strong><%= icon_form.file_field :flagged, :index => nil %>
        <%= link_to_function image_tag('remove_16.png'), "this.up('.icon_graphic').remove()"%><br/>
    <% else -%>
        <%= image_tag icon_graphic.icon.url %><br/>
        <strong>Replace <%= icon_graphic.icon_file_name %>: </strong><%= icon_form.file_field :icon, :index => nil %><br />
        <% if icon_graphic.flagged_file_name.blank? -%>
        <strong>Upload Flagged Icon: </strong><%= icon_form.file_field :flagged, :index => nil %>
        <% else -%>
        <strong>Replace <%= icon_graphic.flagged_file_name %>: </strong><%= icon_form.file_field :flagged, :index => nil %>
        <%= icon_form.hidden_field :flagged, :index => nil %>
        <% end -%>
        <%= link_to_function image_tag('remove_16.png'), "mark_for_destroy(this, '.icon_graphic')"%><br/>
        <%= icon_form.hidden_field :id, :index => nil %>
        <%= icon_form.hidden_field :icon, :index => nil %>
        <%= icon_form.hidden_field :should_destroy, :index => nil, :class => 'should_destroy' %>
        <br/><br/>
    <%- end -%>
<% end -%>
</div>

Теперь это выглядит нормально, когда я добавляю новые значки и заполняю оба поля. Однако, если я отредактирую IconSet по факту и, возможно, попытаюсь заменить значок новым, или если я загрузил только один из набора и попытаюсь добавить второе вложение, скрепка не помещает вложения с правильным IconGraphic Model.

Кажется, что хотя у меня есть ID IconGraphic в каждом частичном,

<%= icon_form.hidden_field :id, :index => nil %>

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

Все это происходит при сохранении IconSet, который настроен для сохранения атрибутов IconGraphic.

Я знаю, что это сложно. Возможно, мне просто нужно отредактировать каждую иконку по отдельности, но если кто-то может помочь, я был бы признателен.

1 Ответ

1 голос
/ 30 апреля 2010

Хорошо, я понял это. Проблема заключалась в том, что идентификатор каждой иконки должен указываться ДО полей загрузки, а не после:

<% else -%>
      <!-- Moved the hidden fields before the upload fields -->
        <%= icon_form.hidden_field :id, :index => nil %>
        <%= icon_form.hidden_field :icon, :index => nil %>
        <%= icon_form.hidden_field :flagged, :index => nil unless icon_graphic.flagged_file_name.blank? %>
        <%= image_tag icon_graphic.icon.url %><%= image_tag icon_graphic.flagged.url unless icon_graphic.flagged_file_name.blank? %><br/>
        <strong>Replace <%= icon_graphic.icon_file_name %>: </strong><%= icon_form.file_field :icon, :index => nil %><br />
        <% if icon_graphic.flagged_file_name.blank? -%>
        <strong>Upload Flagged Icon: </strong><%= icon_form.file_field :flagged, :index => nil %>
        <% else -%>
        <strong>Replace <%= icon_graphic.flagged_file_name %>: </strong><%= icon_form.file_field :flagged, :index => nil %>
        <% end -%>
        <%= link_to_function image_tag('remove_16.png'), "mark_for_destroy(this, '.icon_graphic')"%><br/>
        <%= icon_form.hidden_field :should_destroy, :index => nil, :class => 'should_destroy' %>
        <br/><br/>
<%- end -%>
...