是否可以使用表单的创建操作与连接表进行交互?

时间:2010-02-14 00:42:19

标签: ruby-on-rails forms has-and-belongs-to-many

*请注意查看所有代码,请点击链接

我正在创建新的“帐户”。每个新帐户has_many:用户。 用户has_and_belong_to_many角色。我正在尝试在新帐户表单中为新用户分配现有角色。通常一个简单的过程......

用户和角色之间的has_and_belong_to_many关联意味着用户和角色由连接表关联。我没有可以使用的模型。所以我不确定如何编写这个。我能够使用概述here的方法(在答案中)创建新角色,但我无法通过帐户模型将现有角色分配给新用户。

SQl的等价物是这样的:SQL (0.1ms) INSERT INTO "roles_users" ("role_id", "user_id") VALUES (6, 29)我需要29才能像在rails中创建的新用户的ID一样运行,即VAULES(6,ID)

当前代码:(创建新角色)

<% f.fields_for :users do |builder| %>
<%= render 'user_fields', :f => builder %>
<p>Login  : <%= f.text_field :login %>
<p>Email  : <%= f.text_field :email %>
<p>Password  : <%= f.password_field :password %>
<p>Confirm Password  : <%= f.password_field :password_confirmation %>
<%= f.hidden_field :account_id, :value => :id %>


<% f.fields_for :roles do |builder| %>
     <%= builder.hidden_field :name, :value => 'test' %>
<% end %>

Account.rb

has_many :users
accepts_nested_attributes_for :users

User.rb

has_and_belongs_to_many :roles
accepts_nested_attributes_for :roles

accounts_controller.rb

def new
    @account = Account.new
    #builds user and roles in memory
    1.times do
      user =  @account.users.build 
    1.times { user.roles.build }
  end

1 个答案:

答案 0 :(得分:1)

问题是你不应该使用accepts_nested_fields。它用于从调用模型创建和销毁引用模型的项。您希望从用户模型而不是角色本身管理关联。

这是必须要做的事情:

  1. 从user.rb删除accepts_nested_attributes_for :roles(可选,但建议使用)
  2. 在用户创建表单中分配给role_ids字段。
  3. 这个观点应该说明一点:

    <% f.fields_for :users do |builder| %>
    <p>Login  : <%= f.text_field :login %>
    <p>Email  : <%= f.text_field :email %>
    <p>Password  : <%= f.password_field :password %>
    <p>Confirm Password  : <%= f.password_field :password_confirmation %>
    <%= f.hidden_field :account_id, :value => :id %>
    
    <%= f.collection_select :role_ids, Role.all, :id, :name, {}, :multiple => true %>
    
    <% end %>
    

    在不更改任何其他内容的情况下,Rails将在create上填充连接模型,而不是修改现有角色或创建新角色。