Ruby on rails 如何实现Rails 4设计用户以单一嵌套形式使用公司名称注册

Ruby on rails 如何实现Rails 4设计用户以单一嵌套形式使用公司名称注册,ruby-on-rails,ruby,ruby-on-rails-4,devise,Ruby On Rails,Ruby,Ruby On Rails 4,Devise,我有一个Rails 4应用程序,带有一个简单的默认设计注册流程和一个用户模型。现在我添加了一个公司模型,公司和用户模型之间有一对多的关系(一个公司有很多用户,一个用户属于一个公司) 我希望用户在注册时选择一个公司名称,因此注册表单有3个字段:公司名称、用户电子邮件和密码 我得到一个“unpermittedparameters:company”错误,尽管我认为我正在处理强参数问题 我已经阅读了所有类似问题的答案,但没有一个答案有效。下面是我的代码的相关片段: #routes.rb devise_f

我有一个Rails 4应用程序,带有一个简单的默认设计注册流程和一个用户模型。现在我添加了一个公司模型,公司和用户模型之间有一对多的关系(一个公司有很多用户,一个用户属于一个公司)

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

我得到一个“unpermittedparameters:company”错误,尽管我认为我正在处理强参数问题

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

#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"

为了让它工作,您需要在params过滤器中将“company”复数化

u.permit(:email, :password, :password_confirmation, companies_attributes: [:name])

我遇到了一个非常类似的问题,这就是未经许可的参数错误的解决方案。

看来您的params消毒剂不太正确。试试这个:

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

有关更多详细信息,请参阅Strong Parameters文档中的部分。

向我们展示您的
应用程序\u控制器。rb
@Anthony添加了它,但我不知道它有什么关系。您能否将参数哈希传递给您的
用户::RegistrationsController
?@mmichael-sure,只是把它添加到问题的底部。这并不能解决我的问题。你有多对多的关系吗?在我的例子中,每个用户都属于一家公司,这就是为什么我不认为我需要多元化。当我这样做时,我得到了以下错误:ActiveRecord::AssociationTypeMismatch In Users::RegistrationController#create company(#70176387154620)预期,得到ActionController::Parameters(#70176363254880)啊,很遗憾,
似乎接受了
的嵌套属性与
所属的
不兼容。有关详细信息和可能的解决方案,请参阅。是的,我读到了。那里的一些人声称,接受\u嵌套的\u属性\u确实与\u一起工作。我现在什么都试过了,除了和一个外键所有者的has_-one关系。我也试过所有者的id外键,仍然没有运气。我一定是在什么地方犯了些愚蠢的错误。
def configure_permitted_parameters
  devise_parameter_sanitizer.for(:sign_up) do |u|
    u.permit(:email, :password, :password_confirmation, company: [:name])
  end
end