Rails 4 - 当前布局的名称?

Ric*_*eck 9 ruby-on-rails ruby-on-rails-4

我已经为Rails 3找到了很多资源,但Rails 4没有:


为了保持干燥,我们有一个定义一些元标记的方法.我想在titleparam中包含布局:

  #app/controllers/application_controller.rb
  before_action :set_meta_tags

  def set_meta_tags
    title = (layout != "application") ? "#{layout} ::" : false
    set_meta title: "#{layout} #{setting(:site, :title)}", description: setting(:site, :description)
  end
Run Code Online (Sandbox Code Playgroud)

唯一的问题是我不知道如何返回Rails 4中的当前布局 - 任何帮助将不胜感激!

Ric*_*eck 11

在Rails 5中,代码是:

controller.send :_layout, ["some_string_here"]
Run Code Online (Sandbox Code Playgroud)

我不知道为什么它需要一个字符串在数组中,但这就是它为我工作的原因.我们的帮助文件如下所示:

def current_layout
  layout = controller.send :_layout, ["test"]
  return layout.inspect.split("/").last.gsub(/.haml/,"")
end
Run Code Online (Sandbox Code Playgroud)

  • 这在 Rails 6 中失败了,它需要 _layout 方法的两个参数。 (4认同)

小智 10

对于我在 Rails 6 中,current_layout方法看起来像这样

def current_layout
  self.controller.send :_layout, self.lookup_context, []
end
Run Code Online (Sandbox Code Playgroud)

我相信数组是使用的格式列表。该方法_layout是动态构建的,我不确定它对formats参数的期望,但是我只用一个空数组就得到了我想要的行为希望这会有所帮助。


Kir*_*rat 6

您可以添加以下helper methodApplicationHelper:

def current_layout
     (controller.send :_layout).inspect.split("/").last.gsub(/.html.erb/,"") 
end
Run Code Online (Sandbox Code Playgroud)

你可以在set_meta_tags方法中相应地调用它.就像是,

  def set_meta_tags
    title = (current_layout != "application") ? "#{current_layout} ::" : false
    set_meta title: "#{layout} #{setting(:site, :title)}", description: setting(:site, :description)
  end
Run Code Online (Sandbox Code Playgroud)

注意:

.inspect 给我布局名称及其相对路径.

.split("/").last 将删除相对路径并仅返回布局名称(带扩展名).

.gsub(/.html.erb/)删除布局的扩展部分.您可能需要extension根据您使用的模板引擎进行调整,例如使用Haml时.html.haml.


我的解决方案

从与Kirti的聊天中,似乎我忘了提到我们手动设置layout是一个大问题.如果您手动设置布局,这将有效:

#app/helpers/application_helper.rb
def current_layout
   self.send :_layout
end

def set_meta_tags
    title  = (current_layout != "application") ? "#{current_layout.titleize} :: " : ""
    set_meta title: title + setting(:site, :title), description: setting(:site, :description)
end
Run Code Online (Sandbox Code Playgroud)