我正在使用 Devise 和 Rails 4 开发一个网络应用程序。我有一个用户模型,我已经扩展了 2 个额外的表单字段,这样当用户注册时,他也可以提交他的名字/姓氏。(基于http://blog.12spokes.com/web-design-development/adding-custom-fields-to-your-devise-user-model-in-rails-4/)。我现在想添加一个机构模型。该模型has_many :users 和一个用户belongs_to :institution。我希望能够在注册用户的同一表格上注册机构名称。我知道我的机构中需要一个nested_attribute模型,因为这是父模型,我稍后会展示。当我尝试注册用户时,我进入控制台:Unpermited parameters: Institutions。
我的提示是我无法根据我的子类(用户)更新我的父类(机构)。可能有解决方案吗?或者有没有人经历过类似的事情?
class Institutions < ActiveRecord::Base
has_many :users,
accepts_nested_attributes_for :users
end
class User < ActiveRecord::Base
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
belongs_to :institution
end
registrations/new.html.erb这里我有嵌套表格
<%= form_for(resource, :as => resource_name, :url => registration_path(resource_name)) do |f| %>
<%= devise_error_messages! %>
.
.
<%= f.fields_for :institutions do |i| %>
<p><%= i.label :name %><br />
<%= i.text_field :institutions_attr %></p>
<% end %>
根据我之前链接的教程,我创建了一个新的User::ParameterSanitizer,它继承自Devise::ParameterSanitizer并重写该sign_up
方法,如下所示:
lib/user_sanitizer.rb
private
def sign_up
default_params.permit(:first_name, :last_name ,:email, :password, :password_confirmation, :current_password, institutions_attributes: [:id, :name])
end
最后,我的application_controller.rb
class ApplicationController < ActionController::Base
protect_from_forgery with: :exception
protected
def devise_parameter_sanitizer
if resource_class == User
User::ParameterSanitizer.new(User, :user, params)
else
super
end
end
end
感谢您的阅读!
控制台参数输出:
{"utf8"=>"✓",
"authenticity_token"=>"JKuN6K5l0iwFsj/25B7GKDj7WEHR4DO3oaVyGxGJKvU=",
"user"=>{"email"=>"abc@foo.com",
"first_name"=>"abc",
"last_name"=>"xyz",
"institutions"=>{"name"=>"Government"},
"password"=>"[FILTERED]",
"password_confirmation"=>"[FILTERED]"},
"commit"=>"Sign up"}
编辑
按照建议,我添加了
params.require(resource_name).permit( :email, :first_name, :last_name, institution: [:name], :password, :password_confirmation ) and I get an *error syntax error, unexpected ',', expecting => ...nstitution: [:name], :password, :password_confirmation )*
但是,如果我重新编辑
params.require(resource_name).permit( :email, :first_name, :last_name, :password, :password_confirmation, institution: [:name] )
我得到没有语法错误,但我得到未经许可的参数:请求中的机构。
我相信这是因为用户是机构的孩子。但是,我一直无法找到解决此问题的方法。