Rails远程表单成功,但不返回任何数据

时间:2017-05-09 17:32:21

标签: ruby-on-rails ajax coffeescript ruby-on-rails-5

我有一个带有一个输入和发送按钮的简单远程表单。 我为ajax创建了监听器:success:

$ ->
  $form = $('#post-form')

  $form.on 'ajax:success', (e, data, status, xhr) ->
    console.log e
    console.log data
    console.log status
    console.log xhr

我的控制员:

  def create
    @post = Post.new(post_params)
    @post.user_id = 3

    if @post.save
      render partial: 'posts/view', locals: { post: @post }, status: :ok
    else
      render json: @post.errors, status: :unprocessable_entity
    end
  end

我看到请求在后端传递,并返回状态200:

Rendered posts/_view.html.erb (3.0ms) [cache miss]
Completed 200 OK in 480ms (Views: 466.6ms | ActiveRecord: 7.0ms)

但是在devtools我看到了:

enter image description here

我做错了什么?

3 个答案:

答案 0 :(得分:2)

我不确定您在创建帖子后要对数据做什么,但为了接收通过 JSON 发送到操作的数据,您必须从该操作返回 JSON ,如下所示:

def create
  @post = Post.new(post_params)
  @post.user_id = 3

  respond_to do |format|
    if @post.save
      format.html { render partial: 'posts/view', locals: { post: @post } }
      format.json { render json: @post, status: :created }
    else
     format.html { render :new } # assuming you have a view file named "views/posts/new.html.erb"
      format.json { render json: @post.errors, status: :unprocessable_entity }
    end
  end
end

这样您就可以处理请求 JSON ,如果请求只是简单的 HTML ,您就可以处理该请求。

答案 1 :(得分:1)

快速TL; DR:

假设上面的代码,这是您要查找的json响应:

e.detail[0]

这也让我有些烦恼。询问返回的一个对象会使我得到答案-结果主体在返回的事件中可用。我的Rails应用未使用jQuery,因此结果事件对象为ajax:success结果。

结果有一个名为detail的字段,在我的情况下,该字段包含三项:来自被调用请求的响应主体的数据(我相信您正在寻找的内容),字符串{ {1}}和进行呼叫的"OK"

因此,在上面的XMLHttpRequest回调中,如果您询问form.on,我想您会找到json数据(而且,回调中的其他参数都是不必要的)。

我的假设是,沿着这条线的某个地方,远程调用的回调逻辑被简化为包含所有代码的单个参数。看起来好像是在删除对UJS的jQuery依赖项https://guides.rubyonrails.org/working_with_javascript_in_rails.html#rails-ujs-event-handlers时发生的。

答案 2 :(得分:0)

我过去使用的技术是将DOM的一部分替换为AJAX请求的一部分,即

def create
    @post = Post.new(post_params)
    @post.user_id = 3)
    respond_to do |format|
        format.js
    end
end

在/views/posts/create.js.erb

$("#new_item").html("<%= escape_javascript(render partial: 'posts/view', locals: { post: @post } ) %>"); 

看看this link