我正在开发一个 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,这会失败,因为&thisor 或&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应该为空。