我一直在试图让AJAX上传表单正常工作。我正在使用Rails 3.2。我将gem "remotipart", "~> 1.0"
放入我的Gemfile中,运行bundle install
并成功安装。
我之前有这个非ajax上传表单,我根据github page上的文献添加了:remote => true
:
<%= form_tag "/administration/data_imports", :multipart => true, :remote => true %>
<label for="file">Input File</label> <%= file_field_tag "file" %>
<button type="submit">Import Data</button>
</form>
并在我的data_imports_controller
create
操作中执行此操作:
def create
file = params[:file]
filename = file.original_filename
end
我在jquery.remotipart.js
页面上添加了一个javascript include,因为它感觉很重要,虽然没有明确的指示这样做。
我尝试了它,但是它没有给出服务器错误:
Completed 500 Internal Server Error in 4ms
NoMethodError (undefined method `original_filename' for nil:NilClass):
app/controllers/data_imports_controller.rb:16:in `create'
很明显我做了一些根本错误的事情,但我需要一只手。
答案 0 :(得分:1)
幸运的是你。前段时间我遇到了同样的问题。 :)将此添加到您的application.js:
//= require jquery.remotipart
//= require jquery.iframe-transport
您可以从此处获取“iframe-transport”文件:http://cmlenz.github.com/jquery-iframe-transport/。
正如我对其他答案的评论所说:我认为不需要:multipart
,因为你使用的是Rails 3.2。不是100%肯定,因为我仍在使用Rails 3.1。 ;)
希望它有所帮助!
我创建了一个示例应用程序,展示了如何添加remotipart以启用AJAX文件上传。它对我很有用。
https://github.com/RobinBrouwer/remotipart_example
请参阅该存储库中的提交以了解所执行的步骤。
答案 1 :(得分:1)
通过一种我并不真正理解的方式来实现与我想要的东西相似的东西,但是嘿,它有点工作。我不得不添加一些jQuery:
$("#myform").submit(function(e) {
e.preventDefault();
$.ajax(this.action, {
files: $(":file", this),
iframe: true
}).complete( function(data) {
eval(data.responseText);
});
});
我认为接管表单提交,使用此iframe-transport lark启动ajax帖子,然后评估返回的内容(因为在我的情况下我将返回javascript)。我还必须从表单中删除:remote => true
,否则它会发布两次或其他内容。
以为我会在这里发帖,以便它可以帮助某人或引导某人做得更好。
答案 2 :(得分:1)
在我的情况下,我有旧版jquery.iframe-transport.js
答案 3 :(得分:0)
问题在于您实际声明:multipart=> true
请使用下面的代码,然后您的表单将接受文件参数。
form_for "/administration/data_imports",:remote => true,:html => {:multipart => true}