2014-02-03 2 views
1

У меня есть модель 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, чтобы создать действие для проверки дублирующегося содержимого, но оно кажется довольно взломанным. Может кто-нибудь, пожалуйста, дайте мне знать, почему это происходит?

+0

Это потому, что каждый раз, когда вы отправляете форму, она посылает _everything_ снова и снова. Честно говоря, я думаю, что вложенные формы - это действительно путь. В Интернете есть множество учебников, посвященных тому, как это сделать элегантным способом. – Hesham

+0

Да, это наблюдаемое поведение, но любые мысли о том, почему все посылается снова и снова? –

ответ

0

Вы не можете иметь элементы вложенной формы в соответствии со спецификацией html (see this answer).

Для этого вы можете использовать nested forms, он обеспечивает создание связанных моделей через jquery с помощью полезных оберток form_helper.

+0

На самом деле они не вложены, извините за ошибку, и я отредактировал вопрос соответственно. –

+0

Для обеспечения безопасности вы должны установить пользователя в своем контроллере на current_user, люди могут проверить страницу и изменить user_id. – Fletcher91

+0

хорошо, спасибо за головы! есть ли что-то еще, что не так с формой? –

Смежные вопросы