いくつかのモデルを適切に結び付けようとする Hobo アプリに取り組んでいます。
Activity
オブジェクトには多くのPage
子があります。彼らには多くのDataSet
子供もいます。
Page
オブジェクトには、いくつかの異なる種類の子があります。子供について話しますWidget
が、同じ問題を抱えたタイプがいくつかあります。のインスタンスは にWidget
属しますがPage
、 ともbelongs_to
関係がありDataSet
ます。重要な点は次のとおりです。DataSet
は、含まれている に属している必要がありActivity
ます。したがって、任意の@widget
:
@widget.page.activity === @widget.data_set.activity
保存時に検証を行うことで、モデルにこの制約を適用するのは簡単です。トリックは、 のフォーム内で、現在ののみを含むWidget
利用可能な の選択メニューを提示することですDataSet
DataSet
Activity
次のようなタグを使用して、既存のオブジェクトに対してこれを機能させることができました。
<data_set-tag: options="&DataSet.activity_is(&this.page.activity)" />
ただし、new の場合、 orがまだ設定されていないWidget
ため、これは乱雑に失敗します。のようなページ ID を含むルートであっても、のリストをスコープする を実際に取得することはできません。&this
&this.page
/pages/:page_id/widgets/new
Activity
DataSet
これが適切な 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.page
Bryan Larsen の答えは、 null であってはならないことを示唆しているようです。