2012-12-14 62 views
0

我正在研究一个Hobo应用程序,试图正确地将几个模型绑定在一起。获取Hobo中未保存对象的祖先对象

Activity对象有很多Page孩子。他们也有很多孩子。

Page对象有几种不同的孩子。我们将讨论Widget孩子,但有几个类型的问题相同。 Widget的实例属于Page,但也与DataSetbelongs_to的关系。以下是重要的一点:DataSet必须属于包含Activity。因此,对于任何给定的@widget

@widget.page.activity === @widget.data_set.activity 

这是很容易执行模型中的这个约束与保存验证。诀窍是提出,在Widget的形式,提供DataSet s的选择菜单,只包含DataSet S为当前Activity

我能得到这个工作使用标签这样的现有对象中:

<data_set-tag: options="&DataSet.activity_is(&this.page.activity)" /> 

但是,对于Widget,失败乱七八糟,因为无论&this&this.page尚未设置。即使是包含页面ID的路线,例如/pages/:page_id/widgets/new,我也无法真正获得Activity来确定DataSet s的列表。

如果这是正确的Rails,我会采用相关的控制器方法,并使Activity可用于视图@activity或类似的东西,但在Hobo控制器似乎是95%Magic™和I不知道从哪里开始。哪些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小号;错误是undefined method 'page' for nil:NilClass。 Bryan Larsen的回答似乎暗示&this.page不应该为空。

回答

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))" /> 
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,这种失败乱七八糟,因为无论&这样或& this.page尚未设置。

它看起来像你正确使用所有者操作。 /pages/:page_id/widgets/new是路线。在widgets_controller中,这是new_for_page操作。在new或new_for操作中,this被设置为该对象的未保存版本。在你的行动中,它应该已经创建了相当于Page.find(params[:page]).widgets.new。换句话说,应该填充thisthis.page

我相信你没有让你的声明出来,所以可能还有其他的事情发生。

+0

我并没有试图将其发布到流浪汉用户的邮件列表;我不知道有一个存在,尽管我没有感到惊讶。也许它会被某些东西自动重定向?无论如何,这个答案给了我几个探索的立足点,谢谢!我会回来一点,要么报告成功,要么改进我的问题。 – pjmorse

+0

我从这个答案中学到的第一件事:我没有/不明白'this'是什么。 (我的意思是,我了解建筑,但我并不总是明白Hobo的设置。) – pjmorse

+0

:S好吧,我有一些同意,'&this.page.activity' *应该*工作,但不是。我们最新的策略是'app/helpers/application_helper.rb'中的一个帮助器,它将'&this'作为参数并返回相应的'Activity',但当用'&this'作为参数调用时,它会说“参数数量错误0表示1)“。 Grrr ... – pjmorse