2010-06-12 63 views
5

我的網絡應用程序,直到這一點,一直相當直接。我有用戶,聯繫人,約會和一些其他的事情來管理。所有這些都很容易 - 每個部分只有一個模型,所以我只是爲每個部分做了一個腳手架,然後修改了腳手架代碼以適應我的需要。很容易...一個控制器與多個模型?我是否正確地做這件事?

不幸的是我在下一節遇到了問題,因爲我希望我的應用的「財務」部分比我簡單搭建的其他部分更深入。例如,當用戶點擊導航欄上的「聯繫人」鏈接時,它只顯示一個聯繫人列表,非常簡單,並且與腳手架一致。但是,當用戶單擊導航欄上的「財務」鏈接時,我想要在頁面左側顯示銀行帳戶,並在右側顯示一些交易。

所以財務標籤將基本上與來自兩個模型的數據:交易和bank_accounts。我認爲我應該做的模型(交易& bank_accounts),然後做一個控制器稱爲財務,那麼我就可以查詢從財務控制的模型,並顯示在應用程序/視圖/財務頁/

我是正確在這個應用程序佈局?我從來沒有超過腳手架的基礎工作,所以我想確保我得到這個權利!

謝謝!

回答

4

如果您習慣使用腳手架,那麼我建議您生成兩個

交易支架:script/generate scaffold transaction financial_id:integer ...

bank_accounts:script/generate scaffold bank_account financial_id:integer ...

和財務script/generate scaffold financials ...

在您的交易模型,加入:

class Transaction < ActiveRecord::Base 
    belongs_to :financial 
end 

在你BANK_ACCOUNT模型中,補充一點:從你的財務

class Financial < ActiveRecord::Base 
    has_many :transactions 
    has_many :bank_accounts 
end 

現在控制器,你可以使用這樣的事情:

class Bank_account < ActiveRecord::Base 
    belongs_to :financial 
end 

在你的財務模型,添加此

def index 
    @financial = Financial.find(params[:id]) 

    #This fetches all bank_accounts related to financial 
    @bank_accounts = @financial.bank_accounts 

    #This fetches all transactions related to financial 
    @transactions = @financial.transactions 
end 

在您的意見中,您可以通過執行此操作查看屬於某個財務的所有銀行賬戶:

<% @bank_accounts.each do |bank_account| -%> 
    <%=h bank_account.something_here %> <!-- something_here is the column name corresponding to your bank_account table. --> 
    <%=h bank_account.something_here %> <!-- something_here is the column name corresponding to your bank_account table. --> 
    <%=h bank_account.something_here %> <!-- something_here is the column name corresponding to your bank_account table. --> 
    . 
    . 
    . 
<% end -%> 

在你的意見,你可以通過添加類似查看全部屬於特定金融交易:

<% @transactions.each do |transaction| -%> 
    <%=h transaction.something_here %> <!-- something_here is the column name corresponding to your bank_account table. --> 
    <%=h transaction.something_here %> <!-- something_here is the column name corresponding to your bank_account table. --> 
    <%=h transaction.something_here %> <!-- something_here is the column name corresponding to your bank_account table. --> 
    . 
    . 
    . 
<% end -%> 

請記住,在創建一個新的事務/的BankAccount使用屬於特定金融的ID 。希望這可以幫助。乾杯! :)

+1

我不確定這是否是實現這些模型關係的最佳方式。據推測,賬戶和交易具有一對多的關係。爲了創建控制器而強制它們成爲模型的子代,並且僅僅爲了顯示兩個相關模型的信息而將它們視爲一體,這比其他任何方面都更具有變通性。 – Shaun 2010-06-12 14:36:36

+0

你說得對。但我只是想回答@ user363243面臨的直接問題,只記得一些X和Y模型與Z控制器綁定在一起。由於沒有明確提出,我沒有更多的推測。 :) – 2010-06-12 14:47:25

+0

嘿,夥計們,感謝您的幫助!上述例子唯一的問題是,'財務'只是我分組bank_accounts及其相關交易的一種方式。我本可以稱之爲「銀行中心」或其他任何東西。這就是說,我實際上做不了像@financial = financial.find(params [:id]) – dingalingchickenwiing 2010-06-12 16:54:49

0

我對Ruby on Rails或MVC的一般工作沒有大量的經驗,但我認爲你會以正確的方式去做。您通常需要一個模型對象(以及通過擴展名,數據庫表)來獲取面向數據的資源......也就是說,您的模型應該與您的「名詞」相對應。你的控制者的行爲就是你的「動詞」,對我來說,把它們分類爲你喜歡的東西是完全合理的。

在這種情況下,我會說根據需要在financials下放置一些「動詞」,它們與兩種模型對象類型進行交互,這很有意義,如果對您有意義,您可以像這樣組織它。 (請記住,您還可以評估相應的URL對您的感覺有多好,儘管我相信大多數MVC純粹主義者會補充說,您絕不應該僅僅依靠檢查URL!)

因此,在總結,我認爲你做的一切都在這裏,只要它對你有意義。是的,您必須自己編寫視圖和控制器操作,但您可以開始使用ruby script/generate controller financials action1 action2 [...];至少給你視圖文件和空控制器動作的骨架。

1

,如果你想兩個視圖這聽起來對我說:

然而,當用戶點擊導航欄上的「財務」鏈接,我想顯示在左側的銀行賬戶該頁面和一些右側的交易。右側的交易。

請記住,一個屏幕並不總是指MVC中的一個視圖。從概念上講,視圖只是簡單地呈現模型數據,以便用戶可以通過控制器操作對其執行一些有意義的操作。 Rails通過在每個屏幕的views /目錄中創建一個文件,使得它變得更加混亂,因此很容易認爲一個屏幕意味着一個視圖。不過,你也可以在Rails的視圖中調用佈局,這些佈局本身就是視圖。

將交易和賬戶放在不同的視圖中意味着每個賬戶都有一個控制器來處理用戶與每個數據段的交互。例如,賬戶控制器將處理用戶選擇賬戶以查看關於賬戶的附加信息的事件。這會導致獲取交易以顯示用戶。然後,用戶可以與交易進行交互,試圖協調,無效或對其進行競爭。這將調用事務控制器中的邏輯。

儘管這樣可以很好地從控制器中去除耦合,但這看起來好像將兩個視圖耦合在一起。但是,耦合是單向的:帳戶列表包含特定於交易視圖的邏輯(即,在您選擇帳戶時更新它)。事務視圖在應用程序的其他區域中仍然可以重用。大多數情況下,帳戶列表仍然可以重複使用,特別是在將其隔離爲單獨的佈局時。您在此特定屏幕上唯一需要的區別是處理用戶點擊帳戶的時間。

如果您將所有內容合併到財務視圖中,仍然可以將事物鬆耦合,但這樣做變得更加困難。額外的層需要額外的努力,並可能潛意識地引導您將所有東西合併在一起。

當然,無論哪種方式都行得通,而且您可能會很容易爭辯說最終的設計是一項最適合開發人員偏好的練習。我只是提供我的解釋,說明如何最精確地堅持Rails試圖引導開發人員使用的模式。

+1

我很難理解這一點 - 對不起,但我很新的軌道!你是否建議我應該爲每個模型(bank_accounts和交易)設置一個控制器,並引用我將做的財務控制器的那些控制器?如果這不是你的意思,我不明白。 :( – dingalingchickenwiing 2010-06-12 16:58:20

+1

您將有兩個模型和兩個控制器:bank_accounts和transactions中的每一個控制器,每個控制器將管理與視圖相關的操作並與模型進行交互 根據用戶需要查看或與數據交互在你給的例子中,你的「財務」頁面將有兩個視圖:一個允許用戶點擊並選擇一個賬戶的銀行賬戶列表,以及顯示在主窗格中的一個交易列表有關的交易 – Shaun 2010-06-12 17:27:17

+0

好的,當你說「在你給的例子中,你的」財務「頁面會有兩個視圖:一個允許用戶點擊並選擇一個賬戶的銀行賬戶列表,以及一個交易列表顯示相關交易的主窗格「。當你說視圖時,你是否意味着局部? 我問這個,因爲我可以從另一個目錄加載一個部分(即app/views/bank_accounts/_accounts.html.erb和app/views/transactions/_transaction_list.html.erb) – dingalingchickenwiing 2010-06-12 17:33:41

相關問題