我正在研究一个Hobo应用,试图将几个模型正确地绑在一起。
Activity
个对象有很多Page
个孩子。他们也有很多DataSet
个孩子。
Page
个对象有几种不同的孩子。我们将讨论Widget
个孩子,但有几个类型有同样的问题。 Widget
的实例属于Page
,但与belongs_to
的{{1}}关系。重点是:DataSet
必须属于包含DataSet
。因此对于任何给定的Activity
:
@widget
通过保存验证,可以很容易地在模型中强制执行此约束。诀窍是在@widget.page.activity === @widget.data_set.activity
的表单中显示可用Widget
的选择菜单,该菜单仅包含当前DataSet
的{{1}}
我能够使用这样的标记使现有对象正常工作:
DataSet
但是,对于 new Activity
,这会很麻烦,因为尚未设置<data_set-tag: options="&DataSet.activity_is(&this.page.activity)" />
或Widget
。即使对于包含网页ID的路线(例如&this
),我也无法通过&this.page
获取/pages/:page_id/widgets/new
的范围。
如果这是正确的Rails,我会进入相关的控制器方法并使Activity
可用于视图DataSet
或类似的东西,但在Hobo中控制器似乎是95%Magic™,我不知道从哪里开始。 Activity
当前的知识必须在某处;我怎么把它拿出来?
这是Rails 3.0.x上的Hobo 1.3.x。
ETA:产生错误的代码位于@activity
的{{1}}标记中,如下所示:
Activity
正如我上面所说,这适用于编辑现有form
,但不适用于新Widget
s;错误是<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>
。 Bryan Larsen的回答似乎表明Widget
不应该为空。
答案 0 :(得分:1)
看起来你试图将这个问题发布到Hobo用户邮件列表 - 我收到了一个审核消息,但似乎没有发布你的帖子,也没有找到它让它通过。请尝试重新发布,列表中有几个有用的人不会在这里监控Hobo标签。
在Hobo 1.3中,新动作不支持AJAX部分,因此真的没什么魔力。您可以使用自己的操作替换操作:
def new_for_page
@activity = Activity.find(...)
@page = Page.find(params[:page_id])
@widget = @page.widgets.new
end
上面引用了一些魔法:如果你在WidgetsController中,分配给@widget也会分配给this
。
但正如你所说,知识明显存在于某处,并且你的自定义控制器动作不一定是必要的。
这句话似乎错了:然而,对于一个新的Widget,这很麻烦,因为还没有设置&amp; this或&amp; this.page。
看起来您正在使用所有者操作。 /pages/:page_id/widgets/new
是路线。在widgets_controller中,它是new_for_page
操作。在new或new_for操作中,this
设置为未保存的对象版本。在您的操作中,应该使用等效的Page.find(params[:page]).widgets.new
创建它。换句话说,应填充this
和this.page
。
我确定你没有凭空捏你的陈述,所以可能还有别的事情发生了。
答案 1 :(得分:0)
最后,结果证明是语法。而不是
<data_set-tag: options="&DataSet.activity_is(&this.page.activity)" />
我需要
<data_set-tag: options="&DataSet.activity_is(@this.page.activity)" />
(请注意@
)。
我们实际上将它变成了一个辅助方法,所以最终的代码是
<data_set-tag: options="&DataSet.activity_is(activity_for(@this))" />