我正在开发一个 Hobo 应用程序,试图将几个模型正确地结合在一起。
Activity
对象有很多Page
孩子。他们也有很多DataSet
孩子。
Page
对象有几种不同的孩子。我们将讨论Widget
儿童,但有几种类型具有相同的问题。a 的实例Widget
属于 aPage
但也belongs_to
与 a 有关系DataSet
。这是重要的一点:DataSet
必须属于包含Activity
。所以对于任何给定的@widget
:
@widget.page.activity === @widget.data_set.activity
通过保存验证在模型中强制执行此约束很容易。诀窍是在Widget
's 表单中显示一个可用 s 的选择菜单,DataSet
其中仅包含DataSet
当前的 sActivity
我能够使用这样的标签来为现有对象工作:
<data_set-tag: options="&DataSet.activity_is(&this.page.activity)" />
但是,对于new Widget
,这会失败,因为&this
or 或&this.page
尚未设置。即使对于包含页面 ID 的路由/pages/:page_id/widgets/new
,我也无法真正获得sActivity
列表的范围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
的 s,但不适用于新Widget
的 s;错误是undefined method 'page' for nil:NilClass
。Bryan Larsen 的回答似乎暗示不&this.page
应该为空。