2010-04-28 4 views
1

Хорошо, все это немного сложная настройка, поэтому, если мне нужно прояснить вопрос, просто дайте мне знать.Ajax, Multiple Attachments and Paperclip question

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

class IconSet < ActiveRecord::Base 
    has_many :icon_graphics 
end 

Эта модель имеет много icongraphics:

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

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

Теперь эта настройка работает нормально, если я отредактировал 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 %> 

Это в основном базируется прочь Райан Complex Forms 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.

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

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

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

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

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

ответ

1

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

<% 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 -%>