1

ユーザーがフォームフィールドを動的に追加および削除できるようにするnested_form gemを使用しています。正常に動作していますが、ユーザーが最初の file_field を削除できないようにして、ユーザーが追加したフィールドの場合にのみ「削除」リンクを表示できるようにしたいと考えています。私の「_form」と「_photo_fields」のパーシャルは以下のとおりです。解決策は、「このフィールドがページ上のそのタイプの最初のフィールドでない場合は、「削除」リンクを表示する」のようなことだと思いますが、それを達成する方法がわかりません。あなたが提供できる洞察をありがとう。

_form.html.erb:

<%= simple_nested_form_for @service_offering do |f|%>

... Other Fields ...

<%= f.fields_for :photos do |builder| %>
    <%= render 'photo_fields', :f => builder %>
<%end%>

<%= f.button :submit %>

<p><%= f.link_to_add "Add Photo", :photos %></p>    

_photo_fields.html.erb:

<% if f.object.new_record? %>

<%= f.label :photo %>  
<%= f.file_field :photo %>
# This is where I want to drop that if statement, but I am not sure what it should be.
<%= f.link_to_remove "Remove" %>
#
<%end%>

<% unless f.object.new_record? %>

<%= link_to( image_tag(f.object.photo.url(:thumb))) %>
<%= f.check_box :_destroy %>
<%= f.label :_destroy, "Remove" %>

<%end%>
4

2 に答える 2

2

fields_for ブロック内でレンダリングされるものが「新規追加」ボタンのテンプレートとして使用されるため、ERB から非表示にすることはできません。したがって、そこに削除リンクを非表示にすると、追加されたアイテムには削除リンクがありません。

nested_form_for コードを見たところ、これに対するネイティブ サポートはありません。最も簡単な解決策ですが、理想的ではありませんが、CSS または JS によってクライアントの削除リンクを非表示にすることです。

私はこのJSでそれを解決しました:

$(function() {
  $('a[data-nested-form-disable-first]').each(function() {
    var nested_container = $(this).closest('.fields');

    // check if is first
    if (!nested_container.prev().is('.fields')) {
        $(this).remove();
    }
  });
});

そして、「data-nested-form-disable-first」を追加してリンク定義を削除します。

<%= f.link_to_remove 'Remove', 'data-nested-form-disable-first' => '' %>

ページがロードされたときに除去不可能なフィールドがページ内にあることを確認した場合にのみ機能します。

于 2013-05-22T09:23:41.970 に答える
0

ここに 2 つのオプションがあります。

  1. 写真を削除できるかどうかを尋ねることができれば、それが最も簡単な解決策です
  2. CSS でフォ​​ーム内のリンクを非表示にすることができます。

写真 API

次のような方法で写真モデルを拡張してみてください

class Photo ...
  def removable?
    ...
  end
end

_photo_fields.html.erb:

...
<%= f.file_field :photo %>
<% if f.object.photo.removable? %>
  <%= f.link_to_remove "Remove" %>
<% end %>

CSS の使用

よくわかりませんが、次の方法で可能になるはずです:

  1. div写真フィールドにを追加
  2. 関連するルールを CSS に追加します。

コードは次のとおりです (変更または追加する必要があるフラグメントのみ:

_photo_fields.html.erb:

<div class="photo_fields">
   ...
   <%= f.link_to_remove "Remove", :class => "remove" %>
   ...
</div>

アプリケーション.css:

div.photo_field:first-child > a.remove {
  display: none;
}

最初の解決策は、可能であれば適切なものです。これは、削除できないものを削除することをまったく許可しないためです。2 つ目は、リンクを非表示にする回避策ですが、はるかに脆弱です。

于 2011-12-10T19:17:44.410 に答える