2017-01-09 6 views
0

私は宝石に入れ替えて使用しました。今すぐ登録しました&ログインページ。 私のアプリに自分のIDと電子メールアドレスを書き込んだとき、ブローサーは1つのエラーでこのユーザーが保存されないことを教えてくれました:IDは空白にできません。もちろん、私は確かにIDを書いています。 このブローサーエラーですか? 私は、移行ファイルにusers.rb1人のユーザーがこのユーザーを保存できませんでした:IDを空白にすることはできません

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 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] 
 
    \t @user = UserData.new(user_params) 
 
    @user.save 
 

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

 
    private 
 

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

home_controllerに書いた

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

+0

ユーザーを作成するときに 'id'を設定する必要はありません。自動的に生成されます。 –

+0

thx、作成アクションでid = params [:id]を削除しましたが、同じエラーが発生しました。 – kanade2017

+0

rails consoleでUserを作成できますか? idを指定せずに –

答えて

2

検証は、作成前に実行されます。したがって、idは保存する前に作成されることはありません。

この validates :id, presence: true

を外し、createアクションに手動idを設定しないでください。

+0

thx、ur answer.I id = params [:id]&validates:id、presence:true、およびrails sを再度表示してください。しかし、私はHomeController#indexにActiveRecord :: RecordNotFoundのエラーがあります。 'id' =のユーザーを見つけることができませんでした。idを削除したので自然です。私のアプリケーションをうまく動作させるにはどうすればよいですか? – kanade2017

+0

あなたの 'index'アクションに' id'があるとは思いません。したがって、 'params [:id]'は現在 'nil'です。エラーは 'find_user'にあります。 –

0

コメントやidがレールと、それを検証する必要はありませんが自動的に作成されるように、ライン

validates :id, presence: true 

下に除去します。お使いのコントローラで

そして は、プライベートメソッドのコードを変更:

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

はモデルからラインの下に削除し、IDが自動生成されたフィールドがあるとして。

は検証:ID、プレゼンス:真

Updateは以下のようにコントローラファイルでアクションを作成し、

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

はあなたのコードごとにモデル名である "ユーザー" と "UserDataのを" 置き換え。

関連する問題