首次发布者,网站上有很多查找答案的人(谢谢!)。我正在使用Rails 5.2.3,ruby-2.6.2和Devise gem 4.6.2。即使有很多here,here,here和here相关的问题,我也无法得到答案。
新用户注册后,我希望他们从注册表单的下拉列表(已创建)中选择他们的公司。 (最终,这将是管理员角色,但这超出了此问题的范围。)
我创建了一个注册控制器,并在之前的许多帖子中添加了代码。更新,我没有像下面指示的那样扩展Devise:Extending Devise Registration Controller。这是我的新注册控制器。
class Users::RegistrationsController < Devise::RegistrationsController
before_action :configure_sign_up_params, only: [:create]
before_action :configure_account_update_params, only: [:update]
def new
@companies = Company.all
super
end
def create
@companies = Company.all
super
end
protected
def configure_sign_up_params
devise_parameter_sanitizer.permit(:sign_up, keys: [:company_id])
end
def configure_account_update_params
devise_parameter_sanitizer.permit(:account_update, keys: [:company_id])
end
end
并使用new.html.erb和edit.html.erb在视图/注册中创建新文件,我从devise / registrations视图中复制了确切的代码。
我更新了route.rb文件以包括:
devise_for :users, :controllers => { registrations: 'users/registrations', sessions: 'users/sessions' }
我的用户模型是:
class User < ApplicationRecord
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :validatable
belongs_to :company
accepts_nested_attributes_for :company
end
我的公司模型是:
class Company < ApplicationRecord
has_many :users
end
在新用户注册表单中,此操作可提供下拉菜单,但是当我尝试创建新用户时,它说:1错误禁止保存该用户:公司必须存在。
<%= f.collection_select :company, @companies, :id, :name, prompt: true %>
我以为this post会找到答案,但这似乎使用了Rails 3和attr_accessible,在Rails 4中已弃用。
我不太了解accept_nested_attributes_for :company
的作用。公司模型中唯一的东西就是名称。
提前谢谢!
答案 0 :(得分:1)
欢迎使用StackOverflow。
为了向devise的注册表单添加更多参数,您需要使用devise的清理程序对相应的参数进行清理。
您应该这样做:
class ApplicationController < ActionController::Base
before_action :configure_permitted_parameters, if: :devise_controller?
protected
def configure_permitted_parameters
devise_parameter_sanitizer.permit(:sign_up, keys: [:company_id])
end
end
您可以在设计的自述文件的this部分中找到有关参数清理和添加自定义字段的更多信息
如果您还想添加一个包括所有现有公司的选择字段,则应添加一个选择集合:
<%= f.collection_select :company_id, Company.all, :id, :name %>
答案 1 :(得分:0)
知道了!
要扩展Devise控制器,请遵循以下帮助:Extending Devise Registration Controller
还必须更新用户模型以包括可选的:true,因为这里https://blog.bigbinary.com/2016/02/15/rails-5-makes-belong-to-association-required-by-default.html:
class User < ApplicationRecord
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :validatable
belongs_to :company, optional: true
accepts_nested_attributes_for :company
end