1错误禁止此用户被保存:Id不能为空

时间:2017-01-09 04:31:15

标签: ruby-on-rails ruby

我在gem中使用了devide,现在我制作了注册和登录页面。 当我在我的应用程序中写入我的ID和电子邮件地址时,blowser告诉我1错误禁止此用户被保存:Id不能为空。当然,我肯定写了id,所以我不知道为什么。 这个吹风机错误了吗? 我在home_controller中写道,

class HomeController < ApplicationController
   before_filter :find_user, only: [:index]

  def index
    # @id = params[:id]
    # @email = params[:email]
    if id == @user.id  && email == @user.email
      render :text =>   "sucsess"
    else
      render :text =>   "fail"
    end
  end

  def create
    id = params[:id]
    email = params[:email]
   	@user = UserData.new(user_params)
    @user.save

   	unless  userData.save
   		@error_message = errors.full_messages.compact
   	end
  end

   private

   def find_user
     user = User.find(params[:id])
     if current_user.id != user.id
       redirect_to root_path
     end
   end
end

在users.rb

class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable, :omniauthable

  validates :id, presence: true
  validates :email, presence: true, uniqueness: true

         
end

在迁移文件中

class DeviseCreateUsers < ActiveRecord::Migration
  def change
    create_table(:users) do |t|
      ## Database authenticatable
      t.string :email,              null: false, default: ""
      t.string :encrypted_password, null: false, default: ""

      ## Recoverable
      t.string   :reset_password_token
      t.datetime :reset_password_sent_at

      ## Rememberable
      t.datetime :remember_created_at

      ## Trackable
      t.integer  :sign_in_count, default: 0, null: false
      t.datetime :current_sign_in_at
      t.datetime :last_sign_in_at
      t.string   :current_sign_in_ip
      t.string   :last_sign_in_ip

      ## Confirmable
      # t.string   :confirmation_token
      # t.datetime :confirmed_at
      # t.datetime :confirmation_sent_at
      # t.string   :unconfirmed_email # Only if using reconfirmable

      ## Lockable
      # t.integer  :failed_attempts, default: 0, null: false # Only if lock strategy is :failed_attempts
      # t.string   :unlock_token # Only if unlock strategy is :email or :both
      # t.datetime :locked_at

      
      t.timestamps null: false
    end

    add_index :users, :email,                unique: true
    add_index :users, :reset_password_token, unique: true
    # add_index :users, :confirmation_token,   unique: true
    # add_index :users, :unlock_token,         unique: true
  end
end

在routes.rb

Rails.application.routes.draw do
  get 'notes/new'

  devise_for :users
  root to: "home#index"
  get 'home/index'
  get 'home/create'
  

  namespace :home, default: {format: :json} do
    resources :index, only: :create
  end
end

3 个答案:

答案 0 :(得分:2)

验证在创建之前运行。因此,在保存之前,.... while(i<n+1){ j <- ifelse(i+1==n+1,1,i+1) # j=i+1 and j=1 for the last iteration A.area<-0.5*(poly.d[i,2]*poly.d[j,1]-poly.d[j,2]*poly.d[i,1]) A.sum<-A.sum+A.area C.x<-(poly.d[i,2]+poly.d[j,2])*(poly.d[i,2]*poly.d[j,1]-poly.d[j,2]*poly.d[i,1]) C.xsum<-C.xsum+C.x C.y<-(poly.d[i,1]+poly.d[j,1])*(poly.d[i,2]*poly.d[j,1]-poly.d[j,2]*poly.d[i,1]) C.ysum<-C.ysum+C.y i<-i+1 } C.ysum<-C.ysum/(6*A.sum) C.xsum<-C.xsum/(6*A.sum) .... 将无法创建。

删除它 id

并且不要在validates :id, presence: true操作上手动设置id

答案 1 :(得分:2)

从模型中删除以下行,因为ID是自动生成的字段。

验证:id,presence:true

在控制器文件中更新创建操作,如下所示,

def create
  @user = User.new(user_params)
  @user.save
  unless  @user.save
    @error_message = errors.full_messages.compact
  end
end

将“UserData”替换为“User”,这是根据您的代码的型号名称。

答案 2 :(得分:0)

评论或删除以下行

validates :id, presence: true

因为id是由rails自动创建的,无需验证它。

和 在您的控制器中,更改私有方法代码:

def find_user
  @user = User.find(params[:id]) #replace user to @user
   if current_user.id != user.id
   redirect_to root_path
  end
end