【问题标题】:Can't add Company (from separate model) to Devise User无法将公司(来自单独的模型)添加到设计用户
【发布时间】:2019-11-15 12:03:01
【问题描述】:

首次发帖,多次在网站上找到答案(谢谢!)。我正在使用 Rails 5.2.3、ruby-2.6.2 和 Devise gem 4.6.2。尽管有很多相关的问题herehereherehere,但我一直无法得到工作的答案。

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

我创建了一个注册控制器,并根据之前的一些帖子添加了代码。更新,我没有像这里所指出的那样扩展设计: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 在视图/注册中创建了新文件,我从设计/注册视图中复制了确切的代码。

我更新了我的 routes.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 做了什么。 Company 模型中唯一的内容就是名称。

提前谢谢你!

【问题讨论】:

    标签: ruby-on-rails devise


    【解决方案1】:

    欢迎来到 StackOverflow。

    为了向 devise 的注册表单添加更多参数,您需要使用 devise 的 sanitizer 对相应的参数进行清理。

    你应该这样做:

    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 %>
    
    

    【讨论】:

    • 谢谢 - 我试过了,但除非用户可以输入 company_id 的整数值,否则我无法让它工作。我想让他们从下拉列表中选择公司名称。
    • 不过,这是一个不同的问题,您有两种选择: 1. 显示现有公司的选择,用户可以在其中选择自己的公司。 2.对公司进行预处理,然后手动将company_id传入params
    • 哦不,我一定没有解释清楚。我正在尝试获得选项 1
    • 这是一个非常简单的解决方案,所以我创建了一个新项目来尝试它(我的代码目前有很多可能会与此解决方案混淆)。我基本上安装了 Devise,scaffold'd Company,然后实施了您的解决方案。有一个错误:Devise::Registrations#new 中的 NoMethodError。 # 的未定义方法 `company_id'
    • 嗯,你必须在你的用户模型中添加一个company_id 才能让它工作,你是为它添加了自定义迁移,还是在设计迁移中添加了它?
    【解决方案2】:

    知道了!

    要扩展 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-16
      • 2012-08-13
      • 1970-01-01
      • 2014-10-24
      • 1970-01-01
      • 2014-10-24
      • 1970-01-01
      • 2015-03-24
      相关资源
      最近更新 更多