首页 > 解决方案 > 尝试使用 Rails 上的设计注册时,UsersController#create 中的 ArgumentError

问题描述

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

用户控制器中的参数错误#创建的参数太少

在此处输入图像描述

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

这是我的 routes.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 

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

这是我的 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

标签: ruby-on-railsrubydevise

解决方案


首先,当我们写

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 ,只需重定向它。


推荐阅读