Как удалить ссылку «Удалить», если поле формы является первым полем формы на странице с гемом Nested_Form? - PullRequest
1 голос
/ 10 декабря 2011

Я использую гем nested_form, который позволяет пользователю динамически добавлять и удалять поля формы. Он работает нормально, но я бы хотел, чтобы пользователь не мог удалить первое поле 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%>

Ответы [ 2 ]

2 голосов
/ 22 мая 2013

вы не можете скрыть его от ERB в поле зрения, потому что то, что отображается внутри блока fields_for, затем используется в качестве шаблона для кнопки «Добавить новый». Так что, если вы спрячете там ссылку для удаления, ни у одного добавленного элемента не будет ссылки для удаления.

Как я посмотрел на коде 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' => '' %>

Работает только в том случае, если вы убедились, что несъемное поле находится на странице при его загрузке.

0 голосов
/ 10 декабря 2011

Я вижу здесь два варианта для вас:

  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>

application.css:

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

Первое решение является правильным, если это возможно, потому что оновообще не позволяет удалить несъемную вещь. Второй - это обходной путь, который скрывает связь, но намного слабее.

...