不,諧音不叫控制器。你在控制器中實例化你需要的對象。所以如果你想渲染一個地址部分,你會得到控制器中的地址。
如果你需要的所有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 %>
感謝J- dexx - (對於不回頭道歉,這個'好玩'是我的兼職演出)。這很有用,我玩過不同的選項,並且喜歡使用UserFacade方法。 – Ben
不用擔心。另外,您可以在外觀中委派方法,以便您可以執行'@ user_facade.name'而不是'@ user_facade.user.name' –