【问题标题】:nested form & habtm嵌套形式和习惯
【发布时间】:2010-06-11 20:27:58
【问题描述】:

我正在尝试保存到 habtm 关系中的联接表,但我遇到了问题。

在我看来,我传入了一个组 ID:

<%= link_to "Create New User", new_user_url(:group => 1) %>

 

# User model (user.rb)
class User < ActiveRecord::Base  
  has_and_belongs_to_many :user_groups
  accepts_nested_attributes_for :user_groups
end

 

# UserGroups model (user_groups.rb)
class UserGroup < ActiveRecord::Base
  has_and_belongs_to_many :users
end

 

# users_controller.rb
def new
  @user = User.new(:user_group_ids => params[:group])
end

在新用户视图中,我可以访问 User.user_groups 对象,但是当我提交表单时,它不仅没有保存到我的联接表 (user_groups_users) 中,而且该对象不再存在。我的用户对象的所有其他对象和属性都是持久的,除了用户组。

我刚开始学习 Rails,所以也许我在这里在概念上遗漏了一些东西,但我一直在努力解决这个问题。

【问题讨论】:

  • 当你提交表单时你调用create 方法,对吧?能否请您发布此方法的代码?

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


【解决方案1】:

您是否考虑过仅将用户添加到控制器中的组而不是使用accepts_nested_attributes_for?这样你就不需要来回传递 user_group_id。

在 users_controller.rb 中:

def create
  @user = User.new params[:user]
  @user.user_groups << UserGroup.find(group_id_you_wanted)
end

这样,您还可以阻止人们篡改表单并将自己添加到他们想要的任何组中。

【讨论】:

  • 自从我最初发布这个问题以来,我学到了很多东西。这正是我现在使用的方法。
【解决方案2】:

您的 create 方法在 users_controller.rb 中是什么样的?

如果您在视图中使用 fields_for 构造,例如:

<% user_form.fields_for :user_groups do |user_groups_form| %>

您应该能够将 params[:user](或其他任何内容)传递给 User.new(),它将处理嵌套属性。

【讨论】:

    【解决方案3】:

    扩展@jimworm 的答案:

    groups_hash = params[:user].delete(:groups_attributes)
    group_ids = groups_hash.values.select{|h|h["_destroy"]=="false"}.collect{|h|h["group_id"]}
    

    这样,您已经从 params 散列中提取散列并仅收集 id。现在您可以单独保存用户,例如:

    @user.update_attributes(params[:user])
    

    并在一行中分别添加/删除他的组ID:

    # The next line will add or remove items associated with those IDs as needed
    # (part of the habtm parcel)
    @user.group_ids = group_ids
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-03
      • 1970-01-01
      • 2020-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多