リモートが true に設定されている Rails フォームを使用してファイルをアップロードしようとしています。Rails 4.1.1 を使用しています。私のモデルがメッセージであり、JavaScript を使用しているため、ユーザーはページをリロードせずに複数のメッセージを簡単に送信できるとしましょう。フォームは次のように設定されています。
<%= form_for @message, url: {action: "create"}, html: {:class => "message-form", multipart: true}, remote: true do |f| %>
ユーザーは、必要に応じて、メッセージと共に画像をアップロードできます。MessageImage はフォーム内でネストされた属性として機能し、次のように宣言されます ( http://railscasts.com/episodes/196-nested-model-form-revised方法):
<%= f.fields_for :message_images do |builder| %>
<%= render 'message_image_fields', f: builder %>
<%= link_to_add_fields "Add an image", f, :message_images %>
<% end %>
私のコントローラーでは、アクションはおおよそ次のようになります。
if @message.save
flash.now[:success] = "Message sent"
else
flash.now[:alert] = "Error sending the message"
end
respond_to do |format|
format.html { render 'new' }
format.js { render 'new' }
end
ユーザーが画像を送信しない限り、これは完全に機能しますが、画像を送信する場合は、format.js の代わりに format.html を使用します。format.html を削除すると、ActionController::UnknownFormat-exception が発生します。
これは明らかに、remote を true に設定してファイルを送信できないという事実に関係しています。少し検索してみたところ、この宝石https://github.com/JangoSteve/remotipartが見つかりました。これはまさに私が探しているもののようです。指示に従ってインストールしましたが、何らかの理由でまだ機能せず、format.html を削除すると ActionController::UnknownFormat-exception が発生します。ただし、ネストされた属性を含む例は見つかりませんでした。この宝石またはこれを修正する他の方法に代わるものはありますか、またはユーザーがファイルを送信した場合に HTML をレンダリングするように設定する必要がありますか?