我的表单没有将参数存储在模型中

My form does not store the params in model

本文关键字:存储 模型 参数 表单 我的      更新时间:2023-09-26

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

所以我编写了一个 Ajax 按钮。 当我单击该按钮时,会弹出警报并返回刚刚创建的新用户的 ID。问题是当我在 rails 控制台上查看模型 User.last 的最后一条记录时,记录的所有字段均为 nil(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);
}

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

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


路线.rb

轨道路线中有一个名为resources的函数 - 这允许您通过单个函数调用创建多个轨道路线 - resources :controller

您似乎正在手动声明路由,这对于newcreate等通用函数通常被认为是不好的做法,我建议您首先将routes.rb文件更改为:

#app/config/routes.rb
resources :users 

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


Users_Controller.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 对象)的方法,这些数组可以通过 ajax 传递;而完整的JavaScript调用具有更大的范围


Create.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变量