0

いくつかのモデルを適切に結び付けようとする Hobo アプリに取り組んでいます。

Activityオブジェクトには多くのPage子があります。彼らには多くのDataSet子供もいます。

Pageオブジェクトには、いくつかの異なる種類の子があります。子供について話しますWidgetが、同じ問題を抱えたタイプがいくつかあります。のインスタンスは にWidget属しますがPage、 ともbelongs_to関係がありDataSetます。重要な点は次のとおりです。DataSetは、含まれている に属している必要がありActivityます。したがって、任意の@widget:

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

保存時に検証を行うことで、モデルにこの制約を適用するのは簡単です。トリックは、 のフォーム内で、現在ののみを含むWidget利用可能な の選択メニューを提示することですDataSetDataSetActivity

次のようなタグを使用して、既存のオブジェクトに対してこれを機能させることができました。

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

ただし、new の場合、 orがまだ設定されていないWidgetため、これは乱雑に失敗します。のようなページ ID を含むルートであっても、のリストをスコープする を実際に取得することはできません。&this&this.page/pages/:page_id/widgets/newActivityDataSet

これが適切な 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です。&this.pageBryan Larsen の答えは、 null であってはならないことを示唆しているようです。

4

2 に答える 2

1

この質問を Hobo Users メーリング リストに投稿しようとしたようです -- モデレーション メッセージを受け取りましたが、投稿が投稿されていないようで、投稿を許可することもできません。再投稿してみてください。このリストには 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ます。

しかし、あなたが言ったように、知識は明らかにどこかにあり、カスタムコントローラーアクションは必要ありません.

このステートメントは間違っているようです: しかし、新しいウィジェットの場合、 &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 に答える