2016-06-14 64 views
0

新手入門,一直在玩,並試圖理解約定& MVC方法的東西。從原始對象背景來看,使用rails範式會讓我感到困擾,並且我無法找到關於基本原理/最佳方法的好建議。Rails重用:爲什麼控制器不能在partials內重用?

部分僅用於渲染視圖?它不'調用控制器'。

讓我舉例說明:假設有3個對象,3個控制器和3臺的看法

  • 用戶
  • 地址主頁
  • 用戶歷史

如果我想要一個登錄主頁,實際顯示所有模型的內容,我似乎必須創建一個「站點控制器」和視圖,這是主頁,但我必須在站點控制器中複製「邏輯」以設置變量例如用戶,地址和用戶歷史,然後通過各種部分/表單訪問。

在測試中,我設置了3組測試以獲取所有視圖和數據的工作。 但是在組合主頁中,我似乎必須將控制器邏輯複製到「站點」中央/主頁中。

在「對象世界」中,我的大腦說我可以嵌入控制器調用來支持視圖,因此我可以簡單地重用地址,用戶和用戶歷史記錄控制器。 * 或者我完全錯過了這個工作方式。什麼我錯誤理解專家或方向的歡迎意見。*

這些例子似乎過於重新執行我的觀點和洞似乎交付解決方案

  1. reuse the view only
  2. to reuse a controller use a super class

乾杯 本

回答

1

不,諧音不叫控制器。你在控制器中實例化你需要的對象。所以如果你想渲染一個地址部分,你會得到控制器中的地址。

如果你需要的所有3,你可以創建控制器擔憂這對他們

module GetStuff 
    extend ActiveSupport::Concern 

    included do 
    before_action :set_user 
    before_action :set_address 
    end 

    def set_user 
    @user = # code for getting user 
    end 
end 

class UsersController 
    include GetStuff 
end 

或行動前有一個假設你從應用控制器繼承,你可以簡單地設置一個爲他們的行動有之前的所有頁面(但如果你有其他控制器繼承它可能不是最好的想法

如果你經常使用它們,你可以把方法放在應用程序控制器中,並設置幫助器方法,以允許從視圖和控制器訪問方法。

class ApplicationController 
    def current_user 
    @current_user = #code to get user 
    end 
    helper_method :current_user 
end 

# Some view 
<% if current_user %> 
    <%= current_user.username %> 
<% end %> 

或者你可以在助手

module ApplicationHelper 
    def current_user 
    @current_user = #code to get user 
    end 
end 

或者大概地址被鏈接到用戶太多,你可以創建一個門面,只是實例,在你的控制器方法

class UserController 
    def show 
    @user_facade = UserFacade.new(User.find(params[:id]) 
    end 
end 

class UserFacade 
    attr_reader :user 

    def initialize(user) 
    @user = user 
    end 

    def address 
    @address ||= user.address 
    end 

    def user_history 
    @user_history ||= user.history 
    end 
end 

# users/show.html.erb 

<%= render @user_facade.user %> 
<%= render @user_facade.address %> 
<%= render @user_facade.user_history %> 
+0

感謝J- dexx - (對於不回頭道歉,這個'好玩'是我的兼職演出)。這很有用,我玩過不同的選項,並且喜歡使用UserFacade方法。 – Ben

+0

不用擔心。另外,您可以在外觀中委派方法,以便您可以執行'@ user_facade.name'而不是'@ user_facade.user.name' –

相關問題