【发布时间】:2017-11-11 03:35:19
【问题描述】:
我正在尝试向我的一条路由发出 AJAX POST 请求并返回一些 JSON,但我遇到了一个问题,即没有返回 JSON,而是像 GET 请求一样呈现页面。这是我的代码:
查看
<%= form_with url: users_add_skill_path, id: "skills-form", format: 'json' do |f| %>
<%= f.text_field :skill, placeholder: "Submit your skill" %>
<%= f.submit "Submit Skill" %>
<% end %>
这变成了 HTML:
<form id="skills-form" action="/users/add_skill" accept-charset="UTF-8" data-remote="true" method="post"><input name="utf8" type="hidden" value="✓"><input type="hidden" name="authenticity_token" value="token_hereadnfjahbsdkfjabsd">
<label for="skill">Skill</label>
<input placeholder="Submit your skill" type="text" name="skill">
<input type="submit" name="commit" value="Submit Skill" data-disable-with="Submit Skill">
</form>
路线
devise_scope :user do
post '/users/add_skill' => 'users/registrations#add_skill', :defaults =>
{ :format => :json }
end
控制器
class Users::RegistrationsController < Devise::RegistrationsController
respond_to :html, except: [:add_skill]
respond_to :json, only: [:add_skill]
def add_skill
@user = current_user
@user.skills.push(params[:skill])
respond_to do |format|
if @user.save
format.json { render json: @user.skills, status: :created, location: @user }
else
format.json { render json: @user.errors, status: :unprocessable_entity }
end
end
Javascript
const skillsForm = document.getElementById("skills-form");
skillsForm.addEventListener('ajax:success', function(res) {
console.log("added skill");
});
“技能”被持久化到数据库中,所以我知道请求正在正确发出 - 如果我从路由中删除 :defaults => { :format => :json},并更改 respond_to 块中的其他一些内容(对不起我不记得我到底改变了什么),数据是持久的,页面没有改变,所以我很确定 Ajax 请求运行良好,但我不知道如何获得响应。
我看到很多使用 jQuery ajax() 的问题,但我没有使用 jQuery,所以我不确定我应该做什么。任何帮助将不胜感激!
【问题讨论】:
标签: ruby-on-rails json ajax devise