我正在致力于一个霍波应用程序,试图把几个模型正确地联系在一起。
Activity对象有许多Page子对象。他们也有许多DataSet孩子。
Page对象有几种不同的子对象。我们将讨论Widget子项目,但是有几种类型具有相同的问题。Widget的实例属于Page,但也与DataSet有belongs_to关系。重要的一点是:DataSet必须属于包含的Activity。所以对于任何给定的@widget
@widget.page.activity === @widget.data_set.activity在模型中通过对保存进行验证,可以很容易地执行此约束。诀窍是,在Widget的表单中,呈现一个可供选择的DataSet菜单,其中只包含当前Activity的DataSet。
我能够使用这样的标记来实现现有对象的工作:
<data_set-tag: options="&DataSet.activity_is(&this.page.activity)" />然而,对于一个新的Widget,这失败的混乱,因为&this或&this.page还没有设置。即使是包含页面ID的路由(如/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。Bryan的回答似乎表明&this.page不应该是空的。
发布于 2012-12-20 14:29:26
最后,结果是语法问题。而不是
<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))" />发布于 2012-12-17 14:40:43
看起来你想把这个问题发到“霍波”用户的邮件列表上--我收到了一条温和的信息,但你的帖子似乎没有被发布,我也找不到它让它通过。请试着重新发布它,列表中有几个乐于助人的人在这里不监控霍波标签。
在Hobo 1.3中,新的动作不支持部分AJAX,因此实际上没有什么神奇之处。您可以用自己的操作替换该操作:
def new_for_page
@activity = Activity.find(...)
@page = Page.find(params[:page_id])
@widget = @page.widgets.new
end上面引用了一点魔力:如果您在WidgetsController中,分配给@小部件也会分配给this。
但是正如您所说的,知识显然在某个地方,您的自定义控制器操作不应该是必要的。
这条语句似乎是错误的:然而,对于一个新的Widget来说,这失败得非常糟糕,因为这两种方法都还没有设置好&它或&this.page还没有设置。
看起来你在正确地使用所有者操作。/pages/:page_id/widgets/new是路线。在widgets_controller中,它是new_for_page动作。在新的或new_for操作中,this设置为对象的未保存版本。在您的操作中,应该使用等效于Page.find(params[:page]).widgets.new的方法创建它。换句话说,应该同时填充this和this.page。
我相信你不是凭空发表声明的,所以可能还有别的事情要做。
https://stackoverflow.com/questions/13886525
复制相似问题