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

私はちょうど同じ問題に遭遇しました。解決策は、関連するモデルからプレゼンス検証を削除することでした(この質問に基づいて)、あなたの場合は削除します:

検証:group_id、プレゼンス: true

その検証がなくなると、すべてが時計仕掛けのように実行されます

于 2013-03-25T23:06:45.033 に答える
0

割り当てようとしているすべての属性が attr_accessible であることを確認してください。無効にして動作するかどうかを確認するか、Rails サーバー ログの警告を確認してください。

更新: accept_nested_attributes_for を Member モデルに追加し、fields_for でマルチモデル フォームを使用する必要があります。

于 2012-06-18T16:37:01.633 に答える
0

モデルについて間違った方法で考えていると思います。各メンバーは、グループごとに異なる紹介をします。たとえば、member1 には 1 つの紹介があり、member2 には別の紹介がありますか?

サブスクリプション モデルは、メンバーとグループの関係に関する情報を格納する必要があります。その場合、導入はグループモデルで行ったほうがよいでしょう。エラーが発生する理由は、まだ作成されていないグループのサブスクリプションを作成しようとしている (introduction 属性を設定するとき) ためです。

したがって、グループ モデルへの導入を移動し、次に、グループの作成者を自動的にサブスクライブする必要がある場合は (そうする必要があります)、レコードが保存された後に作成アクションでコントローラーへのサブスクリプションを作成するコードを追加します。 . 次に、サブスクリプション モデルでは、グループ内のメンバーのステータス (モデレーター、初心者、ベテラン メンバーなど) を追跡するステート マシンを作成するなど、優れた機能を実行できます。

于 2012-06-18T17:16:58.817 に答える
0

何時間にもわたる調査とフラストレーションの後、Rails 開発者に報告し、最終的に解決策を見つけました。

Rails 3 は、質問で定義されている方法で group_id と member_id を自動的に初期化できません。

したがって、今のところ、それを機能させる方法は 2 つあります。

  1. member_id を非表示フィールドとしてビューに追加します。
  2. すべてを変更して、サブスクリプション モデルを変更しますaccepts_nested_attributes_for。そうすれば、作成される新しいオブジェクトはサブスクリプションであり、グループはネストされたモデルになります。

最初のオプションには重大なセキュリティ ホールがあるため、お勧めしません。

2 番目のオプションは、あまり論理的ではありませんが、この問題を解決するためのよりクリーンでおそらく "Rails の方法" です。

于 2012-06-19T15:56:34.207 に答える