为 Rails 中的布局 class 实例变量选择控制器

Choosing a controller for a layout class instance variable in Rails

我有一个 DateTime class 实例变量 @current_year = DateTime.now.year,我已将其设置为页脚部分。这个部分呈现在我的几个客户端页面上(并且跨多个控制器呈现为页面主体中的 <%= render 'layouts/page_footer' %> - layout/application.html.erb 页面保留用于站点导航,因此格式不会在那里容纳它。虽然我可以为它出现在控制器中的每个页面方法声明它,但我会发现一些更干的东西。是否有一个地方我可以定义我的时间变量以在我的布局中调用组件?

可以 ApplicationController 中添加 set_year 操作,例如:

class ApplicationController < ActionController::Base 

  private 

    def set_year 
      @current_year = DateTime.now.year
    end

end

然后在相关控制器操作中的 before_action 中调用它。类似于:

class FooController < ApplicationController
  before_action :set_year, only: [:some_action, :another_action]
end

或者重复 MrYoshiji 的评论,您可以在 ApplicationController 中创建一个 current_year 动作,例如:

class ApplicationController < ActionController::Base

  def current_year
    @current_year ||= DateTime.now.year
  end

end

在这种情况下,您可以在部分中使用 current_year 而不是 @current_year。然后,正如 Yoshiji 先生所说,如果那种事情让你的船漂浮,你可以把它变成一个帮手。类似于:

module ApplicationHelper

  def current_year
    @current_year ||= DateTime.now.year
  end

end

我想,将 current_year 转移到助手中的好处是它 de-clutters 你的 ApplicationController。我进一步认为,缺点是它(在某种程度上)混淆了 current_year 操作的来源。同样,您必须考虑您的船漂浮系数。

顺便说一句,@current_year 不是 DateTime。这是一个 Fixnum.

您可以在 application_helper.rb 文件中创建一个方法 并在任何你喜欢的地方使用它。

def current_year
  @current_year = DateTime.now.year
end