我正在构建一个用户管理系统,我开始使用一个用于身份验证的设备。
系统将允许用户拥有自己的个人资料,以及家属(儿童)的个人资料。我想象的是,当用户创建他们的帐户时,他们会被添加到用户表(由设备)和基本的电子邮件/密码字段。我还希望用户在单独的个人资料模型中拥有个人资料。与我在StackOverflow上看到的其他问题的方法不同的是,我希望有一个has_many关系,:通过关系表。这就是原因。
每个用户都有自己的个人资料。每个用户都应该能够为其子项创建配置文件,并将这些配置文件与其用户帐户相关联。儿童不会拥有自己的用户模型。因此,每个用户可以拥有多个配置文件。我还想通过关系表来做到这一点。后来,如果用户的配偶加入系统,我希望能够将孩子与父母双方联系起来。
user.rb
class User < ActiveRecord::Base
devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable
# Setup accessible (or protected) attributes for your model
attr_accessible :id, :email, :password, :password_confirmation, :remember_me
has_many :relationships
has_many :profiles, :through => :relationships
accepts_nested_attributes_for :profiles
attr_accessible :profiles, :profiles_attributes
end
profile.rb
class Profile < ActiveRecord::Base
attr_accessible :first_name, :last_name
has_many :relationships
has_many :users, :through => :relationships
end
relationship.rb
# Had to enter at least 6 characters to improve post (formatting was flawed)
class Relationship < ActiveRecord::Base
attr_accessible :first_name, :last_name
has_one :relationship_type
belongs_to :user
belongs_to :profile
end
new.html.erb
<h2>Sign Up for your account</h2>
<%= form_for(resource, :as => resource_name,
:url => registration_path(resource_name)) do |f| %>
<%= devise_error_messages! %>
<div>
<%= f.label :email %><br />
<%= f.email_field :email, :autofocus => true %>
</div>
<div>
<%= f.label :password %><br />
<%= f.password_field :password %>
</div>
<div>
<%= f.label :password_confirmation %><br />
<%= f.password_field :password_confirmation %>
</div>
<%= f.fields_for :profile do |builder| %>
<div>
<%= builder.label :first_name %><br />
<%= builder.text_field :first_name %>
</div>
<div>
<%= builder.label :last_name %><br />
<%= builder.text_field :last_name %>
</div>
<% end %>
<div><%= f.submit "Sign up" %></div>
<% end %>
<%= render "devise/shared/links" %>
浏览到sign_up页面时,表单会正确加载。但是在尝试保存新用户时,我收到以下错误。
无法批量分配受保护的属性:个人资料
在new.html.erb中,我尝试将嵌套表单的行更改为
<%= f.fields_for :profiles do |builder| %>
但这只会导致嵌套表单无法呈现。
我将不胜感激任何帮助!
谢谢!
答案 0 :(得分:0)
:profiles
,而不是:profile
<%= f.fields_for :profiles do |builder| %>
<div>
<%= builder.label :first_name %><br />
<%= builder.text_field :first_name %>
</div>
<div>
<%= builder.label :last_name %><br />
<%= builder.text_field :last_name %>
</div>
您需要在控制器中构建配置文件:
resource.profiles.build