0

我正在开发一个 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应该为空。

4

2 回答 2

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 或 &this.page 还没有设置。

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

我敢肯定你不是凭空发表声明的,所以可能还有其他事情发生。

于 2012-12-17T14:40:43.413 回答
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))" />
于 2012-12-20T14:29:26.893 回答