【问题标题】:rails page titles导轨页面标题
【发布时间】:2011-04-19 23:19:15
【问题描述】:

我不喜欢 rails 默认使用页面标题的方式(只使用控制器名称),所以我正在研究一种新的方式:

应用程序控制器:

def page_title
    "Default Title Here"
end

帖子控制器:

def page_title
    "Awesome Posts"
end

应用布局:

<title><%=controller.page_title%></title>

它运行良好,因为如果我在当前使用的任何控制器中都没有 page_title 方法,它会退回到应用程序控制器中的默认值。但是,如果在我的用户控制器中我希望它为“新”操作返回“注册”,但回退到任何其他操作怎么办?有没有办法做到这一点?

其次,还有其他人在 Rails 中做页面标题的其他方法吗?

【问题讨论】:

    标签: html ruby-on-rails title erb


    【解决方案1】:

    我不同意其他答案,我认为不应按操作设置标题,而应在视图本身内设置。将视图逻辑保留在视图中,将控制器逻辑保留在控制器中。

    在您的application_helper.rb 中添加:

    def title(page_title)
      content_for(:title) { page_title }
    end
    

    然后将其插入您的&lt;title&gt;

    <title><%= content_for?(:title) ? content_for(:title) : "Default Title" %></title>
    

    因此,当您在视图中时,您可以访问从控制器设置的所有实例变量,并且可以在那里进行设置。它还可以防止控制器杂乱无章。

    <%- title "Reading #{@post.name}" %>
    

    【讨论】:

    • 其实,我比我自己更喜欢这个答案。我不知道content_for。感谢发帖。
    • 您能否将三元运算符简化为只使用||,例如:content_for(:title) || "Default Title"
    • @AndyJW - 要使三元组工作,您必须执行 content_for(:title).presence || "Default Title" - 如果内容不存在,content_for 将返回 nil
    • 超级甜蜜的解决方案!
    【解决方案2】:

    我喜欢在我的布局中放置一个包罗万象的默认标题,可以通过设置 @title 来从操作中覆盖它:

    <title><%= @title || "Default Title Here" %></title>
    

    然后你可以在你的动作中生成一个标题:

    def show
      @post = Post.find_by_id params[:id]
      @title = "tybro's blog: #{@post.title}"
    end
    

    【讨论】:

      【解决方案3】:

      我会这样做:

      # Application Controller
      before_filter :set_page_title
      
      private
      
      def set_page_title
        @page_title = "Default Title"
      end
      

      在你的其他控制器中覆盖它

      # Users Controller
      before_filter :set_page_title
      
      def new # in Users controller
        ...
        @page_title = "Sign up"
        ...
      end
      
      private
      
      def set_page_title
        @page_title = "Users"
      end
      

      在你看来:

      <title><%= h @page_title %></title>
      

      【讨论】:

      • 这太棒了。几年前没有想到这一点,我觉得有点愚蠢。恕我直言,这是对这个问题的优雅回答。
      【解决方案4】:

      看看 Ryan Bates(来自 railscasts.com 的 ryanb)nifty layout。他有一种方法可以满足您的需求。它类似于 Garrett 的方式,只是他也移动了 helper 中的默认值。查看helper.rb 文件以及他如何link text 使用它。

      您可以将其安装为 gem(并使用其他不错的功能)或仅使用他的方式。您只需在每个视图中将标题值传递给title(或让它降为默认值)就可以了。我和加勒特一起把这些东西放在视图中。

      【讨论】:

        【解决方案5】:

        布局模板

        在您的布局中(例如application.html.erb)添加:

        <title><%= content_for(:page_title) || "Fallback title" %></title>
        

        页面模板

        在页面模板中,您要指定标题来自:

        <%- content_for(:page_title, "Specific page title") %>
        

        【讨论】:

          【解决方案6】:
          class ApplicationController < ActionController::Base
            before_action :set_page_title
          
            private
          
            def set_page_title
              @page_title = t(".page_title", default: '').presence || t("#{controller_name}.page_title", default: '').presence || controller_name.titleize
            end
          end
          

          我最近开始采用这种方法,然后在布局中输出@page_title。这对我来说似乎工作得很好。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-03-11
            • 1970-01-01
            • 2023-03-14
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多