我的Rails应用程序有六个不同的部分,所有部分都有自己的模型,视图和控制器。
我正试图创建一个"仪表板"访问每个部分的变量的页面。例如,在我的一个控制器中,我有这样的条件:
if @retirementsavingsdiff < 0
@retiregrade = "pass"
end
我似乎无法从不同的视图/控制器访问此变量。
我是否将仪表板逻辑放在 application_controller.rb 中?
答案 0 :(得分: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
答案 1 :(得分:1)
我会避免使用视图助手,而是创建一个包含所有逻辑的新类或模块。通过这样做,您可以在需要时重用该逻辑。
为什么这样做而不是助手呢?你可以轻松测试它。
答案 2 :(得分:0)
helpers
中定义的方法可在所有视图中自动使用。
如果要将控制器内定义的方法转换为辅助方法,也可以这样做:
def my_method
# code
end
helper_method :my_method
更新:
这是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