【问题标题】:Create/Save Users on Rails API using AJAX使用 AJAX 在 Rails API 上创建/保存用户
【发布时间】:2015-08-20 04:53:09
【问题描述】:

我有一个简单的应用程序,它在创建新用户时通过 API 后端提供 JSON。我正在尝试将 AJAX 添加到请求中,以便在添加新用户时不会重新加载页面。我真的是 AJAX/API 的新手,真的不知道需要做什么。

这是我的用户 API 控制器:

class Api::UsersController < Api::BaseController
protect_from_forgery with: :null_session

def create
@user = User.create!(user_params)
respond_to do |format|
  format.html { redirect_to users_list_path, notice: 'User was successfully created.' }
  format.json { render json: @index }
  format.js
end
end



private

  def user_params
    params.require(:user).permit(:name)
  end

  def query_params
    params.permit(:name)
  end

  end

这是我的索引视图(应该用 ajax 调用刷新):

<% content_for :title do %>Users<% end %>
<h3>Here is the user list.  Please click on one to see messages.</h3>
<br/>
<% User.all.each do |user| %>
  <p><%= link_to String(user.id) + '. ' + user.name, messages_list_path(user_id: user.id) %></p>
<% end %>
<br/>
<%= form_tag("/api/users.json", method: "post") do %>
  <%= label_tag(:add_user, "Add User:") %>
  <%= text_field_tag("user[name]") %>
  <%= submit_tag("Add") %>
<% end %>

我遇到的问题是,当我添加一个新用户时,它会将我直接带到显示 JSON 数据的http://localhost:3000/api/users.json。我需要该应用程序基本上停留在表单所在的同一页面上,并且只需使用 AJAX 进行更新。

我对在 Rails 和 AJAX 中构建 API 非常陌生,所以任何帮助都会很棒!

【问题讨论】:

    标签: javascript ruby-on-rails ajax json rails-api


    【解决方案1】:

    remote: true 添加到您的 form_tag 以提交 ajax 调用。 见DOCS

    form_tag("/api/users.json", method: "post", remote: true)

    【讨论】:

    • 虽然这部分正确,但我遇到的问题是它继续呈现 json 数据,而不仅仅是简单地更新视图。我应该有一个 create.js.erb 文件吗?
    【解决方案2】:

    问题是表单在提交时会自动重定向您。您可以放入一个 jQuery 事件侦听器来防止这种情况,然后使用 ajax 调用创建新用户,如下所示:

        $('form').on('submit', submitForm.bind(this, event));
    
        var submitForm = function (event) () {
            event.preventDefault();
            var user = $('form').serialize();
    
           $.ajax({
               url: "/api/users",
               method: "POST",
               data: user,
               dataType: "json",
               success: function(data){
               this.handleSuccess(data);
               }.bind(this)
            });
          };
    

    不确定这是否正是您要寻找的,但希望对您有所帮助!

    【讨论】:

    • 我要试试这个,但也许我应该提供一个更好的解释。我的视图是 /users/index.html ,其中包含所有用户的列表和一个表单并添加用户按钮。理想情况下,我想要的是当我点击添加用户时,它会更新 index.html 而不是将我重定向到 json 数据。
    • 我添加了“remote: true”,现在什么也没有发生,但是当我刷新页面时,它添加了两次记录。
    猜你喜欢
    • 1970-01-01
    • 2020-07-11
    • 1970-01-01
    • 1970-01-01
    • 2019-11-21
    • 1970-01-01
    • 2022-01-05
    • 2018-02-15
    • 1970-01-01
    相关资源
    最近更新 更多