Rails表单 - 如何创建嵌套有多种形式?

时间:2012-09-01 10:30:05

标签: ruby-on-rails ruby ruby-on-rails-3 paperclip simple-form

目前我在用户和照片之间有一个has_one关系。

User model:
has_one :photo
accepts_nested_attributes_for :photo
Photo model:
  belongs_to :user
  Paperclip.options[:command_path] = "/usr/local/bin"
  has_attached_file :image,
          :path => ':rails_root/public/images/ads/:id/:basename.:extension',
          :url  => "images/ads/:id/:basename.:extension"

嵌套表格:

 <%= f.simple_fields_for :photo_attributes, :html => { :multipart => true } do |d| %>
    <%= d.input :billed_navn %>
    <%= d.label :image, :label => 'Upload logo', :required => false  %>
    <%= d.file_field :image, :label => 'Image', :class => 'imagec', :required => 'false', :style => 'margin-bottom:2px;float:left;width:250px;'  %>
    <input type="button" value="Clear" id="clear" style="width:70px;float:left;margin-right:2px;">
    <%= d.input :image_url, :label => 'Billed URL', :input_html => { :class => 'imagec'}, :required => false %>
    <%= f.label :image, :label => 'Billed preview', :required => false  %><div id="preview"></div>
<% end %>

此设置可以正常工作,我可以上传1张照片。 我的用户可以一次上传多张照片。

因此我将useres模型中的关联更改为:

User model:
has_many :photos
accepts_nested_attributes_for :photos

但我怎么应该嵌套的形式呢?如果应该可以一次上传多个图像?

1 个答案:

答案 0 :(得分:0)

accepts_nested_attributes_for事件只允许批量分配一次添加多张照片。 (注意大规模分配安全漏洞!建议使用 strong_parameters gem)。这意味着更新操作可以接受多张照片。

只有在发送时才会添加它,如果用户填写表单中有字段,则会发生这种情况。这主要取决于编辑视图。

因为您不知道用户想要添加多少张照片,所以最好的方法是使用javascript在用户请求时动态为照片添加一组字段。这可以是一个链接,单击该链接会将字段附加到表单。这样,用户可以根据需要一次提交尽可能多的照片。

您还需要进行一些验证,以便在提交一组空白字段(用于照片)时,不会添加非照片照片。

如果你不想使用javascript,你可以做的最好就是假设用户一次最多上传3个,并包含3组照片字段。再次,小心处理空字段。


示例:

<% (1..5).each do |I| %>
  <%= fields_for "user[photo_attributes][]", nil, :index => I do |form| %>
    <%= form.input :billed_navn %>
    ...
  <% end %>
<% end %>