Description
This is more-or-less a cross-post of rails/jquery-ujs#451.
This issue deals with form_for
tags containing one or more file_field
s where :remote => true
.
config.action_view.embed_authenticity_token_in_remote_forms
defaults to false
to facilitate fragment caching (which makes total sense), but the jquery-ujs
gem is currently coded to permit (without alteration -- meaning it will submit as non-ajax) the submit event of any form if:
- the
data-remote
attribute in<form>
tag is set totrue
; and, - the
<form>
tag contains one or more<input type="file" />
children; and, - any
<input type="file" />
tag has a file selected for upload
(Note that, by design, jquery-ujs
does not provide a method to submit file uploads via AJAX. It only provides a non-AJAX fallback. To submit a remote form with file uploads via AJAX, one must include javascript that catches the submit action before jquery-ujs
does.)
Long story short, there is an issue in that jquery-ujs
cannot currently fulfill its role to provide a non-AJAX fallback since there is no hidden input element in the <form>
provided by actionview
(and jquery-ujs
is not using the page's meta tags as it does for remote requests) containing an authenticity token, so none is POST
ed an InvalidAuthenticityToken
is raised in response to the form submission.
The question du jour is where this bug should be fixed: should a hidden input element always be inserted by actionview
in remote form_for
s in which a file_field
is present (regardless of config.action_view.embed_authenticity_token_in_remote_forms
)? (This is the solution suggested by the jquery-ujs
owner.) Alternatively, should jquery-ujs
create a hidden authenticity_token
input tag inside the <form>
dynamically (with the value from the page's meta tags) immediately before it is about to fulfill its fallback role (my inclination).
Please advise/discuss/etc. (I'm happy to contribute a PR resolving the issue in whatever manner is mutually agreeable, but obviously either rails
or jquery-ujs
must be willing to merge it.)