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