【问题标题】:Rails remote form succeeds, but no data is returnedRails 远程表单成功,但没有返回数据
【发布时间】:2017-10-08 03:36:43
【问题描述】:

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

$ ->
  $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 中看到:

我做错了什么?

【问题讨论】:

  • 我也遇到了同样的问题,你找到解决办法了吗?
  • @DeepanshuGoyal 是的,我停止使用 Rails。

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


【解决方案1】:

我不确定您在创建帖子后要如何处理数据,但为了接收通过 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,您可以处理请求。

【讨论】:

  • 这不是我的问题的答案。我想在后端渲染 html 并将其传递给前端,无论请求来自何处。
【解决方案2】:

我过去使用的技术是将 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

【讨论】:

  • 我宁愿避免这种方法。从后端传递渲染的 html 是不可能的吗?我不想让 js 知道视图是如何呈现的,也不想记住我委托了它。
  • 据我所知,这是执行您所描述的操作的首选且优雅的方式。这实际上确实从服务器端传递了呈现的 HTML,它只是将它包装在一段 Javascript 中,替换页面的适当部分。如果您不想重新加载页面,则需要以一种或另一种方式执行此操作。恕我直言,在前端使用手卷 JS 这样做会很麻烦。
  • 如果你不想使用 AJAX,你可以做一些类似 redirect_to @post 的事情来路由回资源。
【解决方案3】:

快速 TL;DR:

假设您的上述代码,这是您正在寻找的 json 响应:

e.detail[0]

这也让我有些恼火。询问返回的一个对象将我引向我的答案 - 结果正文在返回的事件中可用。我的 Rails 应用程序没有使用 jQuery,因此结果事件对象是 ajax:success 结果。

结果有一个名为 detail 的字段(在我的例子中)包含三个项目:来自被调用请求的响应正文的数据(我相信这是您要查找的),字符串 "OK"和拨打电话的XMLHttpRequest

所以,在你上面的form.on回调中,如果你询问e.details[0],我想你会找到json数据(另外,回调中的其他参数是不必要的)。

我的假设是,远程调用的回调逻辑被简化为包含所有代码的单个参数。当为 UJS 移除对 jQuery 的依赖时,似乎发生了这种情况:https://guides.rubyonrails.org/working_with_javascript_in_rails.html#rails-ujs-event-handlers

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-28
    • 2012-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-20
    相关资源
    最近更新 更多