控制器不响应Ajax

时间:2017-07-14 09:46:47

标签: ruby-on-rails ajax

我想使用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_itemscurrent_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,但它不起作用。服务器日志中没有错误。

2 个答案:

答案 0 :(得分:2)

  

MicropostsController处理#create as HTML

这是由于AJAX限制。来自Reference

  

Ajax使用名为xmlhttprequest的内容来发送您的数据。   不幸的是,xmlhttprequests 无法发布文件

那就是说,你不能通过AJAX发布文件。您可能需要RemotipartJquery-File-Upload

的帮助

答案 1 :(得分:1)

您只在成功保存路径中将respond_to的行为告知format.js。您需要在respond_tojs

的任何地方为render添加redirect_to块。