私は、音楽のアルバムとそれに付随する情報を Web サイトにアップロードする AJAX フォームを使用carrierwave
して処理しています。remotipart
フォームを送信した後、フォームがあった部分を新しく作成したアルバムのページにリダイレクトしたいと思います。にあるフォームは\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
機能的には、このコードは私が望むものを実現します。ただし、ルーティングの観点からは意味がありません。よりエレガントなソリューションをどのように記述しますか?