嵌套形式的has_many:通过(Nested form and has_many :through

2019-10-31 20:03发布

我那里有3种型号有点示例应用程序:会员组和订阅。 这个想法是,会员可以订阅到组。

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被创建为无。 但正如你所看到的,我创建从组@member变量,所以我认为它应该被初始化,但它没有。

任何人都可以告诉我的光?

:你可以在这里看到示例应用程序https://github.com/idavemm/nested_form

Answer 1:

确保所有你想分配属性attr_accessible。 你可能只是禁用它,看看它是否工作,或者看到在Rails服务器记录的警告。

更新 :你应该accepts_nested_attributes_for添加到会员模型,并使用多模式形式fields_for。



Answer 2:

我认为你在错误的方式思考你的模型。 将每个成员具有用于每个组不同的介绍。 因此,例如,将有member1上一个引进和member2有不同的介绍?

在订阅模式应该存储有关与成员和组之间关系的信息。 在这种情况下,出台会更好,在模型组。 你得到一个错误的原因是因为你正试图创建订阅(当您将引入属性)对于尚未作出又一个组。

因此,将引进到组模型,然后,如果你想有一个组的创建者将自动订阅它(你应该),添加代码来创建在创建操作订阅到控制器的记录被保存后。 然后,在订阅模式,你可以做很酷的事情就像有一个状态机跟踪与组(主持人,新手,老党员等)成员的地位。



Answer 3:

许多个小时的排查和挫折后,我把它报告给开发者的Rails,我终于有了一个解决方案:

Rails 3中无法初始化GROUP_ID和member_id自动的方式,在这个问题定义。

所以,就目前而言,有两种方法,使其工作:

  1. 添加member_id为在视图中隐藏字段。
  2. 改变一切所以是订阅模式谁拥有accepts_nested_attributes_for 。 这样一来,要创建新的对象是认购,而集团将成为嵌套模式。

第一种选择具有重要的安全漏洞,所以我不建议这样做。

第二个选择,虽然没有太多的逻辑,是更清洁和所谓的“Rails的方式”来解决这个问题。



Answer 4:

我只是碰到了同样的问题,解决办法是删除相关的模型(基于存在验证了这个问题 ),你的情况,删除:

验证:GROUP_ID,存在:真

一旦验证它的消失,一切都运行像钟表



文章来源: Nested form and has_many :through