我想使用Ajax在我的主页上添加微博,而不会在创建后立即重定向。我在表单中添加了remote: true
:
<%= form_for(@micropost, html: { multipart: true }, remote: true) do |f| %>
并编辑了微博控制器的创建动作,如下所示:
def create
@micropost = current_user.microposts.build(micropost_params)
microposts_number = current_user.microposts.where("created_at >= ?", Time.zone.now.beginning_of_day).count
if microposts_number < 10
if @micropost.save
respond_to do |format|
format.html do
flash[:success] = "Micropost created!"
redirect_to root_url
end
format.js
end
else
@feed_items = []
flash[:danger] = @micropost.errors.full_messages.join(', ')
render 'static_pages/home'
end
else
flash[:danger] = "You have exceeded your daily share of microposts (10)."
redirect_to root_url
end
end
微博在主页中显示为项目的orded列表,其中@feed_items
是current_user
的微博集合,因此属于Micropost:
<% if @feed_items.any? %>
<ol class="microposts">
<%= render @feed_items %>
</ol>
<%= will_paginate @feed_items %>
<% end %>
因此我创建了app/views/microposts/create.js.erb
,使用jQuery选择ol.microposts
并使用函数prepend()
将新创建的微博添加到页面中:
$("ol.microposts").prepend('<%= escape_javascript(render partial: @micropost) %>');
用于在_micropost.html.erb
中构建li
元素的部分ol.microposts
在下面是(简化):
<li id="micropost-<%= micropost.id %>">
<%= link_to gravatar_for(micropost.user, size: 50), micropost.user %>
<span class="user"><%= link_to micropost.user.name, micropost.user %></span>
<span class="content">
<%= micropost.content %>
<%= image_tag micropost.picture.url if micropost.picture? %>
</span>
</li>
然而,Micropost控制器不响应Ajax请求,而是重定向到root_url
,仅响应html(来自cloud9服务器的输出):
Started POST "/microposts" for 82.56.61.198 at 2017-07-14 09:44:55 +0000
Cannot render console from 82.56.61.198! Allowed networks: 127.0.0.1, ::1, 127.0.0.0/127.255.255.255
Processing by MicropostsController#create as HTML
...
Started GET "/" for 82.56.61.198 at 2017-07-14 08:51:42 +0000
Cannot render console from 82.56.61.198! Allowed networks: 127.0.0.1, ::1, 127.0.0.0/127.255.255.255
Processing by StaticPagesController#home as HTML
我不明白为什么Micropost控制器的创建操作不响应js格式。我试图克隆部分_micropost.html.erb
并使用实例变量@micropost
而不是迭代的变量micropost
,但它不起作用。服务器日志中没有错误。
答案 0 :(得分:2)
MicropostsController处理#create as HTML
这是由于AJAX
的限制。来自Reference
Ajax使用名为
xmlhttprequest
的内容来发送您的数据。 不幸的是,xmlhttprequests 无法发布文件
那就是说,你不能通过AJAX发布文件。您可能需要Remotipart或Jquery-File-Upload
的帮助答案 1 :(得分:1)
您只在成功保存路径中将respond_to
的行为告知format.js
。您需要在respond_to
或js
render
添加redirect_to
块。