【问题标题】:Is it possible to interact with a join table, with a form's create action?是否可以通过表单的创建操作与连接表进行交互?
【发布时间】:2010-02-14 00:42:18
【问题描述】:

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

我正在创建新的“帐户”。每个新帐户 have_many :users。 用户拥有_and_belong_to_many 个角色。我正在尝试在新帐户表单中将现有角色分配给新用户。然而,通常是一个简单的过程......

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

SQl 等价物是这样的:SQL (0.1ms) INSERT INTO "roles_users" ("role_id", "user_id") VALUES (6, 29)Where I need 29 to function like the new user's created in rails i.e. 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 %>

帐户.rb

has_many :users
accepts_nested_attributes_for :users

用户.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

【问题讨论】:

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


    【解决方案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 将在创建时填充连接模型,而不是修改现有角色或创建新角色。

    【讨论】:

    • 我可以给您寄一张星巴克礼品卡吗?我整天都在解决这个问题。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多