我正在使用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
从功能上讲,这段代码确实达到了我的目的。但是,从路由角度来看,这对我没有意义。你会如何写出更优雅的解决方案?