【问题标题】:Rails 3 accepts_nested_attributes_for with has_many :through relationshipsRails 3 接受_nested_attributes_for 和 has_many :通过关系
【发布时间】:2013-01-18 21:19:39
【问题描述】:

我正在构建一个用户管理系统,并开始使用用于身份验证的设备。

系统将允许用户拥有自己的个人资料,以及受抚养人(子女)的个人资料。我的设想是,当用户创建他们的帐户时,他们会被添加到用户表中(由设备),其中包含基本的电子邮件/密码字段。我还希望用户在单独的个人资料模型中拥有个人资料。我的方法与我在 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" %>

浏览到注册页面时,表单会正确加载。但是,在尝试保存新用户时.. 我收到以下错误。

无法批量分配受保护的属性:配置文件

在 new.html.erb 中,我尝试将嵌套表单的行更改为

<%= f.fields_for :profiles do |builder| %>

但这只是导致嵌套表单无法呈现。

我将不胜感激!

谢谢!

【问题讨论】:

    标签: ruby-on-rails nested-attributes has-many rails-activerecord


    【解决方案1】:

    :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
    

    【讨论】:

    • 那么我将需要覆盖设备的默认registrations_controller。我只是做这样的事情吗? class RegistrationsController
    • 嗯...您可以在视图中构建它,但我认为您确实应该覆盖控制器。
    • 或许您应该让注册页面保持简单,并在成功注册后重定向到用户可以创建个人资料的页面。
    • 我想过这一点,但我想我是想为用户简化流程,并且只有一个表单。
    • 我添加了 并在视图中得到“#<0x007f9eb1bdd1f0>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-22
    • 2011-01-13
    • 2011-03-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多