1

現在、ユーザーと写真の間に 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

しかし、ネストされたフォームはどのようにすべきでしょうか? 一度に複数の画像をアップロードできるようにする必要がありますか?

4

1 に答える 1

1

accept_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 %>
于 2012-09-01T14:00:32.440 に答える