0

我有一个小示例应用程序,其中有 3 个模型:成员、组和订阅。这个想法是成员可以订阅组。

ERD

class Member < ActiveRecord::Base
  has_many :subscriptions, dependent: :delete_all
  has_many :groups, through: :subscriptions

  attr_accessible :email

  validates :email, presence: true
end

class Group < ActiveRecord::Base
  has_many :subscriptions, dependent: :delete_all
  has_many :members, through: :subscriptions

  accepts_nested_attributes_for :subscriptions

  attr_accessible :name, :subscriptions_attributes

  validates :name, presence: true, uniqueness: true
end

class Subscription < ActiveRecord::Base
  belongs_to :group
  belongs_to :member

  attr_accessible :group_id, :introduction

  validates :group_id, presence: true
  validates :introduction, presence: true
end

我正在尝试为新组创建一个表单,并将introduction属性嵌套在其中。

我的控制器方法:

def new
  @group = Group.new
  @group.subscriptions.build
end

def create
  @member = Member.first
  @group = @member.groups.build(params[:group])

  if @group.save
    flash[:success] = "Saved"
    redirect_to group_path(@group)
  else
    render :new
  end
end

但它不起作用。它抛出错误group_id can't be blank。所以我不知道如何将新组分配给订阅。

此外,member_id 被创建为 nil。但是正如您所看到的,我正在从@member变量创建组,所以我认为它应该被初始化,但它没有。

谁能给我看灯?

您可以在此处查看示例应用程序:https ://github.com/idavemm/nested_form

4

4 回答 4

0

确保您尝试分配的所有属性都是 attr_accessible。您可以禁用它并查看它是否有效,或者查看 Rails 服务器日志中的警告。

更新:您应该将accepts_nested_attributes_for 添加到成员模型中,并使用带有fields_for 的多模型表单。

于 2012-06-18T16:37:01.633 回答
0

我认为您以错误的方式考虑您的模型。每个成员对每个小组都有不同的介绍吗?那么,例如,member1 会有一个介绍,而 member2 会有不同的介绍吗?

Subscriptions 模型应该存储有关成员和组之间关系的信息。在这种情况下,最好在小组模型中进行介绍。您收到错误的原因是因为您正在尝试为尚未创建的组创建订阅(当您设置介绍属性时)。

因此,将介绍移至组模型,然后,如果您希望组的创建者自动订阅它(您应该这样做),请在保存记录后在创建操作中添加代码以创建对控制器的订阅. 然后,在订阅模型上,您可以做一些很酷的事情,例如拥有一个状态机来跟踪成员在组中的状态(版主、新手、资深成员等)。

于 2012-06-18T17:16:58.817 回答
0

经过数小时的调查和挫折,我将其报告给 Rails 开发人员,我终于有了一个解决方案:

Rails 3 无法按照问题中定义的方式自动初始化 group_id 和 member_id。

所以,目前,有两种方法可以让它工作:

  1. 将 member_id 添加为视图中的隐藏字段。
  2. 改变一切的订阅模式也是如此accepts_nested_attributes_for。这样,要创建的新对象就是 Subscription,Group 就是嵌套模型。

第一个选项有一个重要的安全漏洞,所以我不推荐它。

第二个选项,虽然不是很合乎逻辑,但更干净,据说是解决此问题的“Rails 方式”。

于 2012-06-19T15:56:34.207 回答
0

我刚刚遇到了同样的问题,解决方案是从相关模型中删除存在验证(基于这个问题),在你的情况下,删除:

验证:group_id,存在:真

一旦验证消失,一切都像发条一样运转

于 2013-03-25T23:06:45.033 回答