submit_tag не отправляет на нужный контроллер и действие в Rails - PullRequest
0 голосов
/ 13 декабря 2018

Я создал форму в своем приложении, которая должна удалить некоторые медиа из моего приложения.

У меня есть объект Album, на котором есть какие-то медиа.Я создал часть с названием media_uploader, чтобы использовать ее в других местах.Я звоню своей части из альбомов / новый взгляд.Как это:

<%= render '/profiles/edit/sidebar', user: current_user %>
        <article class="col-9 col-offset-1">
          <h3 class="color-gray-medium">Album Info</h3>
          <div class="row row-no-padding top-5">
            <%= form_for @album do |f| %>
               <div class="col-9">
                 <div class="form-group row" >
                   <div class="col-6">
                    <label for="">Name:</label>
                    <%= f.text_field :name %>
                  </div>
                 </div>
               </div>
              <div class="col-9">
                 <div class="form-group row" >
                            <div class="col-6">
                              <%= render 'shared/media_uploader', media_contents: @media_contents %>
                            </div>      
                        </div>
                    </div>

shared/_media_uploader.html.erb


<%= link_to 'Delete', delete_media_path, method: :delete, id: 'delete-all', class: 'btn btn-danger', disabled: media_contents.empty? %>
        <br><br>
        <div class="row">
          <div id="media-contents" class="col-12">
            <% if media_contents.empty? %>
              <h5 id="no-media">No Media Found</h5>
            <% else %>
              <% media_contents.each do |media| %>
                <div class="col-4">
                  <div class="thumbnail">
                    <%= image_tag media.file_name_url(:thumb) %>
                    <div class="caption">
                      <p>
                        <%= check_box_tag 'media_contents[]', media.id %>
                      </p>
                    </div>
                  </div>
                </div>
              <% end %>
          </div>
                    </div>
                <% end %>
        <% end %>

Мои маршруты такие:

  resources :media_contents, only: [:create]
  delete 'delete_media', to: "media_contents#delete_media"
  delete 'delete_all', to: 'media_contents#delete_all'

Когда я нажимаю здесь кнопку удаления:

 <%= form_tag({controller: "media_contents", action: "delete_media"}, method: "delete") do %>
              <%= submit_tag 'Delete', id: 'delete', class: 'btn btn-danger', disabled: media_contents.empty? %>

Выдает ошибку:

No route matches [DELETE] "/albums"

Я понимаю, что это связано с внешним form_for: @album.

Вопрос: «Как я могу это сделать?»Как я могу внутри этой формы @album вызвать метод из другого контроллера и заставить его работать?

Ответы [ 2 ]

0 голосов
/ 13 декабря 2018

Вы не можете использовать форму внутри другой формы, это недопустимый HTML.Но вы можете использовать 2 кнопки отправки и решить, что делать внутри действия контроллера, в зависимости от параметра commit.Вам необходимо удалить внутренний form_tag из частичного и изменить действие обновления, например:

if params[:commit] == "Delete"
  # deletion logic or redirect to needed delete action goes here
else 
  # existing `update` goes here
end
0 голосов
/ 13 декабря 2018

Похоже, что ваши маршруты media_contents ограничены "созданием". Добавление: удаление может решить проблему

resources :media_contents, only: [:create, :delete]

Также зачем добавлять собственные маршруты для удаления, когда для контроллера уже существует действие DELETE?

Возможно, ваш form_tag media_contents находится внутри form_tag альбомов .Это может быть одной из причин, по которой он называет контроллер "album"

...