Ruby on rails Rails远程表单成功,但未返回任何数据
我有一个简单的远程表单,带有一个输入和发送按钮。 我为ajax创建了侦听器:成功:Ruby on rails Rails远程表单成功,但未返回任何数据,ruby-on-rails,ajax,coffeescript,ruby-on-rails-5,Ruby On Rails,Ajax,Coffeescript,Ruby On Rails 5,我有一个简单的远程表单,带有一个输入和发送按钮。 我为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 = P
$ ->
$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中,我看到:
我做错了什么?我不确定创建帖子后您想对数据做什么,但为了接收通过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,您就可以处理请求。我过去使用的技术是将DOM的a部分替换为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 } ) %>");
$(“#新项目”).html(“”);
看看。快速TL;博士:
假设您使用上述代码,这就是您要查找的json响应:
e.detail[0]
这也让我有点恼火。通过询问返回的一个对象,我找到了我的答案——结果体在返回的事件中可用。我的Rails应用程序没有使用jQuery,因此生成的事件对象是一个ajax:success
result
结果有一个名为detail
的字段,它(在我的例子中)包含三项:来自被调用请求的响应体的数据(我相信这就是您要查找的)、字符串“OK”
和发出调用的XMLHttpRequest
因此,在您上面的表单中。在
回调中,如果您询问e.details[0]
,我想您会找到json数据(而且,回调中的其他参数也是不必要的)
我的假设是,在某种程度上,远程调用的回调逻辑简化为包含所有代码的单个参数。看起来这是在删除对UJS:.的jQuery的依赖关系时发生的。这不是我问题的答案。我希望在后端呈现html并将其传递到前端,而不管请求来自何处。是否无法从后端传递呈现的html?我不想让js知道视图是如何呈现的,也不想记住我是如何委托它的。据我所知,这是做您所描述的事情的首选且优雅的方式。这实际上是从服务器端传递呈现的HTML,它只是将其包装在一段Javascript中,以替换页面的相应部分。如果不想重新加载页面,则需要以这种或那种方式执行此操作。在前端使用手卷JS做这件事会很麻烦,IMHO。如果你不想使用AJAX,你可以做一些像重定向到@post这样的事情来路由回资源。我也遇到了同样的问题,你找到解决方案了吗?@DeepanshuGoyal是的,我停止使用rails了。