2010-02-14 31 views
1

*要查看所有代碼,請點擊鏈接使用表單的創建動作可以與連接表進行交互嗎?

我正在創建新的「帳戶」。每個新帳戶have_many:用戶。 用戶have_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像在軌道創建的新用戶的ID的功能,即VAULES(6號)

目前代碼:(創建新角色)

<% 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

的問題是你使用accepts_nested_fields當你不應該。它用於創建和銷燬來自調用模型的引用模型的項目。您想要從用戶模型管理關聯,而不是角色本身。

這裏有成功做:

  1. 從user.rb刪除accepts_nested_attributes_for :roles(可選,但推薦)
  2. 分配到role_ids場的用戶創建形式。

這種觀點應該說明了這一點:

<% 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會在創造而不是修改現有的角色或創建新的連接模式。

+0

我可以寄給你星巴克禮品卡嗎?我一整天都在處理這個問題。謝謝! – 2010-02-14 02:36:31

相關問題