无法将公司(来自单独的模型)添加到设计用户

时间:2019-07-04 18:57:24

标签: ruby-on-rails devise

首次发布者,网站上有很多查找答案的人(谢谢!)。我正在使用Rails 5.2.3,ruby-2.6.2和Devise gem 4.6.2。即使有很多herehereherehere相关的问题,我也无法得到答案。

新用户注册后,我希望他们从注册表单的下拉列表(已创建)中选择他们的公司。 (最终,这将是管理员角色,但这超出了此问题的范围。)

我创建了一个注册控制器,并在之前的许多帖子中添加了代码。更新,我没有像下面指示的那样扩展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的作用。公司模型中唯一的东西就是名称。

提前谢谢!

2 个答案:

答案 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