我在 Rails 中有一个应用程序,用户可以在其中发布新帖子。在表单中,我正在传递,:remote => true
所以当记录插入数据库时,帖子会使用 javascript 附加到视图中。到目前为止,这一切正常。
最近我读到这篇关于如何使用 HTML5 ( formData )拖放和自动上传的文章。
我以这样的方式实现了这一点:
- 拖放,工作
- 发送附件并将其交给 Carrierwave,有效
- 创建带有附件的新帖子,工作
只有像以前一样,当创建帖子时,Rails 会渲染create.js.erb
并预先添加新创建的帖子,这不再起作用。帖子是在数据库中创建的,如果我点击重新加载,帖子会正常显示。create.js.erb
但是未执行前面的 javascript 操作。
application.js
var doc = document.documentElement;
doc.ondrop = function(event) {
event.preventDefault();
var files = event.dataTransfer.files,
formData = new FormData(),
xhr = new XMLHttpRequest();
formData.append('authenticity_token', $('meta[name="csrf-token"]').attr('content'));
for (var i=0; i < files.length; i++) {
formData.append('post[image]', files[i]);
};
xhr.open('POST', '/posts', true);
xhr.onload = function() {
if (xhr.status === 200) {
console.log('all done: ' + xhr.status);
} else {
console.log('Something went wrong...');
}
};
xhr.setRequestHeader('accept', '*/*;q=0.5, text/javascript');
xhr.send(formData);
}
posts_controller.rb
def create
@post = Post.create!(params[:post])
end
create.js.erb
$('<%= j render @post %>').hide().prependTo('.posts').fadeIn();
终端显示它作为JS处理的请求:
Processing by PostsController#create as JS
并且我的部分和 ujs 文件也被渲染:
Rendered posts/_post.html.erb (6.4ms)
Rendered posts/create.js.erb (7.9ms)
编辑
好吧,我发现了我的问题,这是我没有在这里讨论的问题。我还使用Pusher将帖子发布给所有正在收听的客户。不知何故,Pusher gem阻止了 UJS 在浏览器中呈现。
所以上面的代码确实适用于 Rails 3。我希望我可以帮助想要尝试 HTML5 拖放上传的人。