1

我有一个 Rails 项目,我必须在不刷新页面的情况下将订阅者数据保存在数据库中!

所以我编写了一个 Ajax 按钮。当我单击按钮时,会弹出一个警报并返回刚刚创建的新用户的 ID。问题是当我查看 Rails 控制台以获取模型User.last的最后一条记录时,该记录的所有字段均为零(ID 除外)。我该如何解决这个问题?


路线:

users_new GET  /users/new(.:format)    users#new
    users GET  /users/index(.:format)  users#index
   create POST /users/create(.:format) users#create

这是我在 app/views/users/new.html.haml 中的看法

.form1
  %h1 
    Subscriber
  =form_for @user do |form|
    - unless @user.errors.empty?
      - @user.errors.full_messages.each do |message|
        .alert.alert-danger
          %ul
            - @user.errors.full_messages.each do |message|
              %li= message
    %div{ :data => { :role => :content} }
      .row.form-group
        .col-lg-3
          %label 
            Email:
          =form.text_field :email, :class => 'form-control'
      .row.form-group
        .col-lg-3
          %label 
            Name:
          =form.text_field :name, :class => 'form-control'
      .row.form-group
        .col-lg-3
          %label 
            Phone Number:
          =form.text_field :phone_number, :class => 'form-control'
      .row.form-group
        .col-lg-3
          %label    
            Address:
          =form.text_field :address, :class => 'form-control'
      %ui-grid-a
        %ui-block-a
          %a.primary{ :data => { :role => :button, :remote => create_path, :parent => '.form1', :success => 'saved' } } Save

这是控制器:

class UsersController < ApplicationController

  def index
  end

  def new
    @user = User.new
  end

  def create
    @user = User.new params[:user]
    @user.save
    render :json => @user  
  end

end

我的 js 文件:

function saved(user){
  alert(user.id);
}
4

1 回答 1

0

有很多事情可能会导致这个问题

考虑到您是 Rails 新手(欢迎!),我认为最好在答案中概述问题,而不是在评论中


路由.rb

在 rails 路由中有一个函数被调用resources- 这允许您通过单个函数调用创建多个 rails 路由 -resources :controller

您似乎正在手动声明您的路线,这通常被认为是通用功能的不好做法,new或者create我建议您首先将您的 routes.rb 文件更改为:

#app/config/routes.rb
resources :users 

这将为您提供一组预先生成的路线,从而使您的代码保持高效


用户控制器.rb

 #/app/controllers/users_controller.rb
 def create
    @user = User.new params[:user]
    @user.save
    render :json => @user  
  end

你这里有大问题

您正在使用AJAX(即 Javascript),并且没有正确处理请求。您确实需要使用respond_to来处理请求的标头类型,并确保您能够正确地使用应用程序

尝试这个:

 #/app/controllers/users_controller.rb
 def create
    @user = User.new params[:user]
    @user.save

    respond_to do |format|
        format.js 
        format.json {  render :json => @user   }
        format.html
    end 
 end

您需要确保的是您知道 JSON 和通过 Ajax 进行的标准“Javascript”调用之间的区别。JSON基本上是处理小数组(称为JSON Objects)的一种方式,可以通过ajax传递;而完整的 javascript 调用具有更大的范围


创建.js.erb

.js.erb基本上是一样的.html.erb

在您的create.js.erb中,您依靠 json 对象来返回新用户的 ID。尽管这可能被认为可以,但我认为您可以通过完全删除 json 对象来提高效率

create.js.erb中,您不需要任何函数来触发事物。它就像一个 HTML 视图一样工作,所以你应该把代码放在你想要触发的地方:

#/app/views/users/create.js.erb  
alert(<%=j @user.id %>);

虽然这里的方法是正确的,但我不知道它是否会输出任何东西,因为我们没有明确传递@user变量

于 2013-11-02T11:11:27.310 回答