【问题标题】:1 error prohibited this user from being saved: Id can't be blank1 个错误禁止保存此用户:ID 不能为空
【发布时间】:2017-01-09 04:31:14
【问题描述】:

我在 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

【问题讨论】:

  • 创建用户时不需要设置id。它应该是自动生成的。
  • thx,我在创建操作中删除了 id = params[:id],但我得到了同样的错误。
  • 你能在 Rails 控制台中创建用户吗?不提供身份证。
  • 另外,请出示user_params

标签: ruby-on-rails ruby


【解决方案1】:

验证在创建之前运行。所以id在你保存之前没有机会被创建。

删除这个 validates :id, presence: true

并且不要在 create 操作上手动设置 id

【讨论】:

  • thx,你的答案。我删除了 id = params[:id] & 验证:id,presence: true,和 rails 再次。但我在 HomeController#index 中收到错误 ActiveRecord::RecordNotFound 不能' t find User with 'id'=。这很自然,因为我删除了 id。我应该怎么做才能让我的应用正常运行?
  • 我认为您的index 操作现在没有id。所以params[:id] 当前是nil。错误在find_user
【解决方案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”,这是模型名称。

【讨论】:

    【解决方案3】:

    评论或删除下面的行

    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
    

    【讨论】:

      猜你喜欢
      • 2014-07-14
      • 1970-01-01
      • 1970-01-01
      • 2014-11-05
      • 1970-01-01
      • 2019-06-07
      • 1970-01-01
      • 2011-04-18
      • 1970-01-01
      相关资源
      最近更新 更多