2

我正在使用carrierwaveremotipart处理 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>

控制器newcreate方法如下所示:

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

从功能上讲,这段代码确实实现了我想要的。但是,从路由的角度来看,这对我来说没有意义。您将如何编写更优雅的解决方案?

4

0 回答 0