いくつかのモデルを適切に結び付けようとする Hobo アプリに取り組んでいます。
Activityオブジェクトには多くのPage子があります。彼らには多くのDataSet子供もいます。
Pageオブジェクトには、いくつかの異なる種類の子があります。子供について話しますWidgetが、同じ問題を抱えたタイプがいくつかあります。のインスタンスは にWidget属しますがPage、 ともbelongs_to関係がありDataSetます。重要な点は次のとおりです。DataSetは、含まれている に属している必要がありActivityます。したがって、任意の@widget:
@widget.page.activity === @widget.data_set.activity
保存時に検証を行うことで、モデルにこの制約を適用するのは簡単です。トリックは、 のフォーム内で、現在ののみを含むWidget利用可能な の選択メニューを提示することですDataSetDataSetActivity
次のようなタグを使用して、既存のオブジェクトに対してこれを機能させることができました。
<data_set-tag: options="&DataSet.activity_is(&this.page.activity)" />
ただし、new の場合、 orがまだ設定されていないWidgetため、これは乱雑に失敗します。のようなページ ID を含むルートであっても、のリストをスコープする を実際に取得することはできません。&this&this.page/pages/:page_id/widgets/newActivityDataSet
これが適切な Rails である場合、関連するコントローラー メソッドをActivity使用して、ビューで使用できるように@activityしますが、Hobo では、コントローラーの 95% が Magic™ のようで、どこにすればよいかわかりません。始める。現在の知識はActivityどこかにあるに違いありません。どうやって出すの?
これは Rails 3.0.x 上の Hobo 1.3.x です。
ETA: エラーを生成するコードは、次のように のformタグにあります。Widget
<extend tag="form" for="Widget">
<old-form merge>
<field-list: fields="&this.field_order">
<data_set-tag: options="&DataSet.activity_is(&this.page.activity)" />
</field-list>
</old-form>
</extend>
上で述べたように、これは既存Widgetの の編集には機能しますが、新しいWidgetの編集には機能しません。エラーはundefined method 'page' for nil:NilClassです。&this.pageBryan Larsen の答えは、 null であってはならないことを示唆しているようです。