2012-12-14 99 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