2014-05-17 66 views
1

我有我的Rails應用程序的六個不同部分,所有這些部分都有自己的模型,視圖和控制器。從多個模型訪問變量

我試圖創建一個「儀表板」頁面來訪問每個部分的變量。舉例來說,在我的控制器之一,我有這樣的條件:

if @retirementsavingsdiff < 0 
    @retiregrade = "pass" 
end 

我似乎無法從雖然有不同的看法/控制器訪問這個變量。

我把儀表板邏輯放在application_controller.rb

+0

是在'controllers'裏面定義的這些變量。他們不能移動到'helpers'文件? –

+0

是的,他們都在控制器中。應用程序可以幫助嗎? – beaconhill

+0

你可以創建一個DashboardController並在index方法中設置所有你需要的變量。 – Iceman

回答

3

使代碼可重用的一個很好的選擇是將它分解成模塊。 Rails 4包含了一個叫做Concerns的東西,這使得這非常簡單。這裏有一個博客帖子有good illustration of using Concerns for Controllers,這裏是你的代碼是什麼樣子的樣本:

# /app/controllers/concerns/retirement_grade_checker.rb 
module RetirementGradeChecker 
    extend ActiveSupport::Concern 

    def check_retire_grade 
    @retirementsavingsdiff = params[:retirementsavingsdiff] 
    if @retirementsavingsdiff < 0 
     @retiregrade = "pass" 
    end 
    end 
end 

# /app/controllers/retirement_controller.rb 
class RetirementController < ApplicationController 
    include RetirementGradeChecker 

    def index 
    check_retire_grade 
    #... other stuff 
    end 
end 

# /app/controllers/dashboard_controller.rb 
class DashboardController < ApplicationController 
    include RetirementGradeChecker 

    def index 
    check_retire_grade 
    #... other stuff 
    end 
end 
+0

如何知道我創建的新模塊是否可以被其他控制器訪問?我只是嘗試這種設計,並得到未初始化的常量FinancesController :: RetirementGradeChecker – beaconhill

+0

你是否堅持你的模塊在應用程序/控制器/關注? –

+0

是的。這與我將它保存爲什麼有關係嗎? – beaconhill

0

helpers中定義的方法在所有視圖中自動可用。

如果要轉換控制器的輔助方法中定義的方法,你也可以這樣做:

def my_method 
    # code 
end 

helper_method :my_method 

UPDATE:

這裏是API

class ApplicationController < ActionController::Base 
    helper_method :current_user, :logged_in? 

    def current_user 
    @current_user ||= User.find_by(id: session[:user]) 
    end 

    def logged_in? 
    current_user != nil 
    end 
end 
爲例
+0

當我將helper_method添加到我的控制器中時,出現以下錯誤:語法錯誤,意外的':',期待keyword_end helper_method: – beaconhill

+0

對不起,這是一個錯字。看到更新的答案。它應該是'helper_method:my_method' –

+1

我認爲@詹姆斯梅森有一個更好的解決您的問題。 –

1

我會避免使用視圖助手,而是創建一個新的類或模塊內部所有的邏輯。通過這樣做,您可以在需要時重複使用該邏輯。

爲什麼這樣做而不是幫手?你可以很容易地測試它。

+0

因此,將我所有的邏輯都移到所有六個控制器中,然後轉移到一個新的幫助器中,這個幫助器可以在所有其他模型中共享? – beaconhill

+0

查看@詹姆斯梅森的答案。他進入更多細節。 –