Rails 4: Как я могу использовать "redirect_to" с AJAX для рендеринга частичного после загрузки файла (ов)?

Я использую carrierwave а также remotipart обрабатывать форму AJAX, где я загружаю альбом музыки и сопроводительной информации на веб-сайт. После отправки формы я бы хотел перенаправить часть, где находилась форма, на страницу вновь созданного альбома. Форма, расположенная в \albums\_new.html.erb выглядит так:

<h1>Add a new album</h1>
<div>
    <%= form_for(album, remote: true, url: {action: "create"}, html: {multipart: true}) do |f|%>
        <h2>Information: </h2>
        <div>
            <%= f.label :title %>
            <%= f.text_field :title %>
            <%= f.label :year %>
            <%= f.text_field :year %>
            <%= f.label :image %>
            <%= f.file_field :image %>
        </div>

        ...

        <%= f.submit "Add Album" %>
    <% end %>
</div>

Контроллер new а также create методы выглядят так:

def new
  @album = Album.new
  @album.producers.build
  @album.tracks.build
end

def create
  respond_to do |format|
    @album = Album.new(album_params)
    if @album.save
      format.js {redirect_to album_path(@album)}
    end
  end
end

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

ActionView::MissingTemplate (Missing template albums/show,
application/show with {:locale=>[:en], :formats=>[:html], :variants=>[],
:handlers=>[:erb, :builder, :raw, :ruby, :coffee, :jbuilder]}.

Я смог реализовать обходной путь, где я просто вызываю то же выражение в create.js.erb что я делаю в show.js.erb:

$('#listen-window').html("<%= j (render partial: 'show', locals: {album: @album, tracks: @tracks, producers: @producers}) %>")

и написать create метод как таковой:

def create
  respond_to do |format|
    @album = Album.new(album_params)
    if @album.save
      @tracks = @album.tracks
      @producers = @album.producers
      format.js
    end
  end
end

Функционально этот код выполняет то, что я хочу. Однако это не имеет смысла для меня с точки зрения маршрутизации. Как бы вы написали более элегантное решение?

0 ответов

Другие вопросы по тегам