在Hobo中获取未保存对象的祖先对象

时间:2012-12-14 21:31:11

标签: ruby-on-rails-3 hobo

我正在研究一个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不应该为空。

2 个答案:

答案 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创建它。换句话说,应填充thisthis.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))" />