加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 如何实现Rails 4设计用户以单一嵌套形式注册公

发布时间:2020-12-17 02:07:17 所属栏目:百科 来源:网络整理
导读:我有一个Rails 4应用程序,带有一个简单的默认Devise注册流程和User模型.现在我添加了一个公司模型,该模型在公司和用户模型之间具有一对多关系(公司has_many用户和用户belongs_to公司). 我希望用户在注册时选择公司名称,因此注册表单有3个字段:公司名称,用户
我有一个Rails 4应用程序,带有一个简单的默认Devise注册流程和User模型.现在我添加了一个公司模型,该模型在公司和用户模型之间具有一对多关系(公司has_many用户和用户belongs_to公司).

我希望用户在注册时选择公司名称,因此注册表单有3个字段:公司名称,用户电子邮件和密码.

我得到了一个“未经许可的参数:公司”错误,即使我认为我正在处理强大的params问题.

我已经阅读了类似问题的所有SO答案,但没有一个答案有效.我的代码的相关片段如下:

#routes.rb
devise_for :users,:controllers => { :invitations => 'users/invitations',:registrations => 'users/registrations',:omniauth_callbacks => "users/omniauth_callbacks"
                                    }

resources :companies


#MODELS
#user.rb
class User < ActiveRecord::Base
  devise :invitable,:database_authenticatable,:registerable,:recoverable,:rememberable,:trackable,:validatable
  devise :omniauthable,:omniauth_providers => [:google_oauth2,:mailchimp,:stripe_connect,:xero]

  belongs_to :company
  accepts_nested_attributes_for :company
end

#company.rb
class Company < ActiveRecord::Base
  has_many :users
end



#CONTROLLER
#users/registrations_controller.rb
class Users::RegistrationsController < Devise::RegistrationsController 
  before_filter :configure_permitted_parameters

  def new
    build_resource({})
    self.resource.company = Company.new
    respond_with self.resource
  end

  def create
    super
  end

  protected
  def configure_permitted_parameters
    devise_parameter_sanitizer.for(:sign_up) do |u|
      u.permit(:email,:password,:password_confirmation,company_attributes: [:name])
    end
  end
end


#application_controller.rb
class ApplicationController < ActionController::Base
  protect_from_forgery

  def after_sign_in_path_for(resource)
    #some_path
  end
end



#VIEW
#sign up form
= form_for(resource,as: resource_name,url: registration_path(resource_name)) do |f|
  = devise_error_messages!
  .form-group
    = f.email_field :email,placeholder: "Email",class: "form-control"
    = hidden_field_tag "plan",params[:plan]
  .form-group
    = f.password_field :password,placeholder: "Password",class: "form-control"
  .form-group
    = f.fields_for resource.company do |cf|
      = cf.text_field :name,placeholder: "Name of your company",class: "form-control" 
  .submit= submit_tag "Sign up now",:class => "button"

传递给Users :: RegistrationsController的params哈希如下:

{"utf8"=>"?","authenticity_token"=>"uWMrX3qVTLL2A1g1ONtBxuj72/GMRZqG5rcOvba/8p4=","user"=>{"email"=>"x@foo.com","password"=>"password","company"=>{"name"=>"F corp"}},"plan"=>"x","commit"=>"Sign up now"}

解决方法

看起来你的params消毒剂不太对劲.试试这个:

def configure_permitted_parameters
  devise_parameter_sanitizer.for(:sign_up) do |u|
    u.permit(:email,company: [:name])
  end
end

有关详细信息,请参阅Strong Parameters文档中的Nested Parameters部分.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读