У меня есть модель Box, и у каждой коробки есть много box_videos (другая модель). Я хочу, чтобы пользователь мог добавить box_videos к коробке, так что я создал следующую форму редактирования для этого (после создания @box):Rails 3.2 - форма ошибочно представлена несколько раз
<%= form_tag "/box_videos", { method: :post, id: "new_box_videos", remote: true } do %>
<%= text_field_tag "box_videos[][link]", '' %>
<%= text_area_tag "box_videos[][description]", '' %>
<%= hidden_field_tag("box_videos[][box_id]", @box.id) %>
<%= hidden_field_tag("box_videos[][user_id]", current_user.id) %>
<div class="another_video">Add Another Video</div>
<%= submit_tag "Save Videos" %>
<% end %>
<%= form_for(@box) do |f| %>
<%= f.text_field :name %>
<%= f.text_field :size %>
<%= f.text_field :all_other_attributes %>
<%= f.submit "Create Box" %>
<% end %>
и некоторые Javascript для облегчения добавления новых box_videos в один клик.
<script>
$('.another_video').click(function() {
$('#new_box_videos').prepend('<input id="box_videos_link" name="box_videos[][link]" placeholder="Link to a youtube video." style="width: 18em;" type="text" value=""><textarea id="box_videos_description" name="box_videos[][description]" placeholder="Describe this video." style="width: 18em;"></textarea><br/><br/><input id="box_videos_box_id" name="box_videos[][box_id]" type="hidden" value="' + gon.box_id.toString() + '"><input id="box_videos_user_id" name="box_videos[][user_id]" type="hidden" value="' + gon.user_id.toString() + '">');
});
</script>
Приведенный выше код работает, в том, что params[:box_videos]
при подаче трех box_videos выглядит следующим образом:
[{"link"=>"https://www.youtube.com/watch?feature=player_detailpage&v=dpAP8bq3ddU
", "description"=>"foo", "box_id"=>"63", "user_id"=>"16"}, {"link"=>"https
://www.youtube.com/watch?feature=player_detailpage&v=dpAP8bq3ddU", "description"
=>"bar", "box_id"=>"63", "user_id"=>"16"}, {"link"=>"https://www.you
tube.com/watch?feature=player_detailpage&v=dpAP8bq3ddU", "description"=>"hello world",
"box_id"=>"63", "user_id"=>"16"}]
В мой контроллер я бы просто создать box_video объект для каждого хеш-массива и работает просто хорошо. НО проблема возникает, когда каждый раз, когда я отправляю вложенную форму form_tag, я посылаю несколько запросов на действие контроллера! Это означает, что создаются дубликаты.
Я могу думать о добавлении логики в контроллер box_videos, чтобы создать действие для проверки дублирующегося содержимого, но оно кажется довольно взломанным. Может кто-нибудь, пожалуйста, дайте мне знать, почему это происходит?
Это потому, что каждый раз, когда вы отправляете форму, она посылает _everything_ снова и снова. Честно говоря, я думаю, что вложенные формы - это действительно путь. В Интернете есть множество учебников, посвященных тому, как это сделать элегантным способом. – Hesham
Да, это наблюдаемое поведение, но любые мысли о том, почему все посылается снова и снова? –