尝试在Rails上使用devise进行注册时,在UsersController#create中出现ArgumentError

时间:2019-04-27 04:51:42

标签: ruby-on-rails ruby devise

我是Rails的新手,我一直试图使用devise gem在我的Rails应用程序中设置注册。当我创建用户时,会弹出以下错误:

UsersController#create中的ArgumentError 争论太少

enter image description here

但是仍然成功创建了用户并将其添加到数据库中。

这是我的route.rb文件:

  resources :users
  devise_for :users
  root to: 'static_pages#home'
  get '/signup', to: 'users#new' 

users_controller.rb中的创建函数是:

    @user = User.new(user_params)
      if @user.save
        format.html { redirect_to user_session_url(@user), notice: 'User was successfully created.' }
        format.json { render :show, status: :created, location: @user }
      else
        render 'new'
      end
    end 

到目前为止,我注意到当我用devise_for:users交换资源:users时,并不会抛出错误,但是在列出所有用户时,它仅保存了devise所需的邮件和密码,而没有保存用户的其他数据,例如姓名,姓氏等。

这是我的User.rb文件:

class User < ApplicationRecord
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable
  validates :name, presence: true, length: {minimum:2, maximum:20}
  validates :last_name, presence: true, length: {minimum:2, maximum:20}
end

2 个答案:

答案 0 :(得分:0)

您的user_params应该包含:

     def user_params
          params.require(:user).permit(:name, :email, :last_name, 
          :admin, :password, 
       :remember_me)
    end

您没有显示该部分。

答案 1 :(得分:0)

首先,当我们写

devise_for :users

它将为您创建包括sign_up和sign_in路径的预定义路由。如果您想保存额外的参数,请“清理”它们。例如:

class ApplicationController < ActionController::Base
   protect_from_forgery with: :exception
   before_action :configure_permitted_parameters, if: :devise_controller?

   protected
    def configure_permitted_parameters
       devise_parameter_sanitizer.permit(:sign_up, keys: [:name, :lastname])
    end
 end

如果要创建自己的自定义控制器和路由,请跳过预定义的路由,例如:

 devise_for :users, :skip => [:sessions, :passwords, :registrations]

并将其保存在routes.rb文件中:

devise_for :users, :skip => [:sessions, :passwords, :registrations]

namespace :api, defaults: {format: :json} do
    devise_for :users, :controllers => {
         :sessions => "api/sessions",
         :passwords => "api/passwords"
    }
end

和session_controller.rb

def session_params
    params.require(:session).permit(:name, :last_name, :all_extra_parameters_defined_here)
end

在user_controller中,无需使用format.html,只需将其重定向。