我有一个带有一个输入和发送按钮的简单远程表单。 我为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我看到了:
我做错了什么?
答案 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。