我有我的Rails應用程序的六個不同部分,所有這些部分都有自己的模型,視圖和控制器。從多個模型訪問變量
我試圖創建一個「儀表板」頁面來訪問每個部分的變量。舉例來說,在我的控制器之一,我有這樣的條件:
if @retirementsavingsdiff < 0
@retiregrade = "pass"
end
我似乎無法從雖然有不同的看法/控制器訪問這個變量。
我把儀表板邏輯放在application_controller.rb?
我有我的Rails應用程序的六個不同部分,所有這些部分都有自己的模型,視圖和控制器。從多個模型訪問變量
我試圖創建一個「儀表板」頁面來訪問每個部分的變量。舉例來說,在我的控制器之一,我有這樣的條件:
if @retirementsavingsdiff < 0
@retiregrade = "pass"
end
我似乎無法從雖然有不同的看法/控制器訪問這個變量。
我把儀表板邏輯放在application_controller.rb?
使代碼可重用的一個很好的選擇是將它分解成模塊。 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
如何知道我創建的新模塊是否可以被其他控制器訪問?我只是嘗試這種設計,並得到未初始化的常量FinancesController :: RetirementGradeChecker – beaconhill
你是否堅持你的模塊在應用程序/控制器/關注? –
是的。這與我將它保存爲什麼有關係嗎? – beaconhill
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
爲例
當我將helper_method添加到我的控制器中時,出現以下錯誤:語法錯誤,意外的':',期待keyword_end helper_method: – beaconhill
對不起,這是一個錯字。看到更新的答案。它應該是'helper_method:my_method' –
我認爲@詹姆斯梅森有一個更好的解決您的問題。 –
我會避免使用視圖助手,而是創建一個新的類或模塊內部所有的邏輯。通過這樣做,您可以在需要時重複使用該邏輯。
爲什麼這樣做而不是幫手?你可以很容易地測試它。
因此,將我所有的邏輯都移到所有六個控制器中,然後轉移到一個新的幫助器中,這個幫助器可以在所有其他模型中共享? – beaconhill
查看@詹姆斯梅森的答案。他進入更多細節。 –
是在'controllers'裏面定義的這些變量。他們不能移動到'helpers'文件? –
是的,他們都在控制器中。應用程序可以幫助嗎? – beaconhill
你可以創建一個DashboardController並在index方法中設置所有你需要的變量。 – Iceman