Как добавить и удалить несколько экземпляров "own_to" в экземпляр "has_many" и из него? - PullRequest
2 голосов
/ 19 мая 2010

В настоящее время у меня есть две модели: кампании и видео. Видео принадлежит Кампаниям, и у Кампании есть много Видео. В своей форме кампании я хочу иметь возможность добавлять видео, которые не имеют родителей, а также удалять видео, принадлежащие выбранной кампании. Я придумал использовать для этого два отдельных списка множественного выбора. В одном списке есть все потерянные видео, а в другом - все видео, относящиеся к выбранной кампании. Таким образом, пользователь и просто выбрать, какие видео для добавления и удаления. У меня возникли проблемы при попытке создать логику добавления и удаления видео из выбранной кампании в моих методах «update» и «create». Я предполагаю, что каким-то образом мне нужно будет взять массив из каждого списка выбора и запустить цикл, который добавляет и цикл, который удаляет выбранные видео в каждой форме.

Я опубликую то, что у меня есть так далеко от моей формы и моих контроллеров:

Контроллер кампаний - Метод обновления:

  def update
    if @campaign.update_attributes(params[:campaign])
      unless request.xhr?
        flash[:notice] = "'#{@campaign.title}' was successfully updated."
      else
        flash.now[:notice] = "'#{@campaign.title}' was successfully updated."
      end
      unless from_dialog?
        unless params[:continue_editing] =~ /true|on|1/
          redirect_to admin_campaigns_url
        else
          unless request.xhr?
            redirect_to :back
          else
            render :partial => "/shared/message"
          end
        end
      else
        render :text => "<script type='text/javascript'>parent.window.location = '\#{admin_campaigns_url}';</script>"
      end
    else
      unless request.xhr?
        render :action => 'edit'
      else
        render :partial => "/shared/admin/error_messages_for", :locals => {:symbol => :campaign, :object => @campaign}
      end
    end
  end

Частичная форма кампании:

<%= error_messages_for :campaign -%>
<% form_for [:admin, @campaign] do |f| -%>

  <div class='field'>
    <%= f.label :title -%>
    <%= f.text_field :title, :class => 'larger' -%>
  </div>

  <div class='field'>
    <%= f.label :description -%>
    <%= f.text_area :description, :rows => 20, :cols => 140, :class => 'wymeditor' -%>
  </div>

  <div class='field'>
    <%= f.label :date -%>
    <%= f.date_select :date -%>
  </div>

  <div class='field'>
    <%= f.label :videos_in, "Add Videos" -%>
    <%= f.collection_select(:title, @orphanedVideos, :id, :title, {}, {:multiple => true}) -%>
  </div>

  <div class='field'>
    <%= f.label :videos_out, "Remove Videos" -%>
    <%= f.collection_select(:title, @campaignVideos, :id, :title, {}, {:multiple => true}) -%>
  </div>

  <div class='field'>
    <%= f.label :preview -%>
    <%= render :partial => "/shared/admin/image_picker", :locals => {
      :f => f,
      :field => :preview_id,
      :image => @campaign.preview,
      :toggle_image_display => false
    } %>
  </div>

  <%= render :partial => "/shared/admin/form_actions", :locals => {:f => f, :continue_editing => false} %>
<% end -%>

Я не уверен, правильно ли настроены collection_select (хотя они правильно отображаются в форме). Любые указатели будут оценены.

Спасибо за внимание!

1 Ответ

0 голосов
/ 24 июня 2010

Я действительно нашел хороший способ, используя флажки. Поэтому для разделов videos_out и vidoes_in я использовал следующий код:

Это должно работать с настройками контроллера по умолчанию, хотя вы должны быть уверены, что позаботились о сценарии, когда ни один элемент не проверен, поместив его в свой контроллер:

#If no checkboxes checked must create an empty array (whole reason for this function override)
params[:campaign][:video_ids] ||= []
...