*请注意查看所有代码,请点击链接
我正在创建新的“帐户”。每个新帐户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
答案 0 :(得分:1)
问题是你不应该使用accepts_nested_fields。它用于从调用模型创建和销毁引用模型的项。您希望从用户模型而不是角色本身管理关联。
这是必须要做的事情:
accepts_nested_attributes_for :roles
(可选,但建议使用)这个观点应该说明一点:
<% 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上填充连接模型,而不是修改现有角色或创建新角色。