【问题标题】:Rails: How to change the title of a page?Rails:如何更改页面的标题?
【发布时间】:2008-10-09 04:53:04
【问题描述】:

在不使用插件的情况下,在 Rails 应用程序中为页面创建自定义标题的最佳方法是什么?

【问题讨论】:

    标签: ruby-on-rails ruby


    【解决方案1】:

    在你的观点中做这样的事情:

    <% content_for :title, "Title for specific page" %>
    <!-- or -->
    <h1><%= content_for(:title, "Title for specific page") %></h1>
    

    布局文件中包含以下内容:

    <head>
      <title><%= yield(:title) %></title>
      <!-- Additional header tags here -->
    </head>
    <body>
      <!-- If all pages contain a headline tag, it's preferable to put that in the layout file too -->
      <h1><%= yield(:title) %></h1>
    </body>
    

    也可以将content_foryield(:title) 语句封装在辅助方法中(正如其他人已经建议的那样)。但是,在这种简单的情况下,我喜欢将必要的代码直接放入特定的视图中,而不需要自定义帮助器。

    【讨论】:

    • 我将此答案与下面的答案合并,为每个页面创建一个“默认标题”:布局中的&lt;title&gt;&lt;%= (yield(:title) + " - " unless yield(:title).blank?).to_s + "This is always shown" %&gt;&lt;/title&gt; 和视图中的&lt;% content_for :title, "Conditional title" %&gt;
    • 与 Rails 5.2.0 完美搭配!
    • 当我使用 &lt;h1&gt;&lt;%= content_for(:title, "Title for specific page") %&gt;&lt;/h1&gt; 时,我看不到任何输出到我的 DOM 中(即我有 &lt;h1&gt;&lt;/h1&gt;,其中没有内容)。但是我的&lt;title&gt;Title for specific page&lt;/title&gt; 工作正常。有什么想法吗?
    • @JoshuaESummers 这里也一样。自从编写上述答案以来,content_for 可能已经发生了变化。我必须使用两个单独的行:&lt;% content_for :title, 'The Title' %&gt; 来设置标题,然后是 &lt;h1&gt;&lt;%= content_for :title %&gt;&lt;/h1&gt; 来显示它。
    • &lt;title&gt;&lt;%= yield(:title).presence || 'default_title' %&gt;&lt;/title&gt; 添加默认标题
    【解决方案2】:

    这是一个我喜欢使用的简单选项

    在你的布局中

    <head>
      <title><%= @title %></title>
    </head>
    

    在页面模板的顶部(第一行)

    <% @title="Home" %>
    

    由于布局和页面模板的解析方式,@title="Home" 会在布局呈现之前进行评估。

    【讨论】:

    • 值得注意的是,这不适用于 Rails 视图缓存。在 rails 3 content_for 足够聪明,可以正确处理缓存(请参阅所选答案)。
    • 不应该在控制器内部设置变量吗?
    • @SajjadMerchant 通常我同意,是的,应该在控制器中设置变量。在这种情况下,模板感觉更合适,因为您正在指定特定于页面外观的属性。控制器动作也可能被两个不同的视图使用(并不是这种情况经常发生,我用它来说明标题与特定模板的紧密结合程度)。
    【解决方案3】:

    @opsb 的改进和 @FouZ 的更完整形式:

    application.html.erb:

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

    在视图erb文件或其控制器中:

    <% @title = "Unique Page Title" %>
    

    【讨论】:

      【解决方案4】:

      这种简单的方法设置了默认标题,但也可以让您随时覆盖它。

      app/views/layouts/application.html.erb:

      <title><%= yield(:title) || 'my default title' %></title>
      

      要覆盖该默认值,请将其放置在您喜欢的任何视图中

      <% content_for :title, "some new title" %>
      

      【讨论】:

      • 您必须使用yield(:title).presence,因此如果接收者不存在,它会返回 nil。以防万一它不适用于其他人。
      【解决方案5】:

      最佳做法是使用 content_for。

      首先,添加几个辅助方法(即,粘贴在 app/helpers/application_helper.rb 中):

      def page_title(separator = " – ")
        [content_for(:title), 'My Cool Site'].compact.join(separator)
      end
      
      def page_heading(title)
        content_for(:title){ title }
        content_tag(:h1, title)
      end
      

      然后在您的布局视图中,您可以简单地使用:

      <title><%= page_title %></title>
      

      ...在视图本身中:

      <%= page_heading "Awesome" %>
      

      这种方式的优点是可以让你在标题中粘贴 h1 标签的位置随机播放,并且让你的控制器保持美观且没有讨厌的@title 变量。

      【讨论】:

      • 如何设置@content_for_title的值?
      • @JordanFeldstein 我不知道他所说的@content_for_title 是什么意思。应该是(content_for(:title) + ' &amp;mdash; ' if content_for?(:title)).to_s + 'My Cool Site'。然后从您的视图中设置它,只需 &lt;% content_for :title, 'My Page Title' %&gt;
      • @content_for_title 是您在撰写此评论时使用 content_for 时发生的情况。我相信情况不再如此,但我最近没有看过。 Toby J 的评论对于今天的 Rails 来说是正确的。我会更新我原来的答案。
      【解决方案6】:

      使用 content_for 方法和部分标题的方法

      1 .部分名称:_page_title.html.erb

      <%content_for :page_title do %>
       <%=title%>
      <%end%>
      

      2 。在title标签内的application.html.erb中使用

         <title><%=yield :page_title %></title>
      

      3 .各自 *.html.erb 中的用法,不包括 application.html.erb 只需将其粘贴在任何 .html.erb 中并提供页面标题

          e.g : inside index.html.erb
      
          <%=render '_page_title', title: 'title_of_page'%>
      

      【讨论】:

        【解决方案7】:

        最好的/干净的方法:

        <title><%= @page_title or 'Page Title' %></title>
        

        【讨论】:

          【解决方案8】:

          查看content_forhttp://railscasts.com/episodes/8

          【讨论】:

            【解决方案9】:

            如果没有关于您要满足的用例或要求的更多详细信息,我可以想到几个替代方案:

            1) 在您的一个布局页面中切换标题并使用存储在application_helper.rb 中的辅助方法

            <title><%= custom_title %></title>
            

            这种方法将为您提供每个布局页面的唯一标题。

            2) Railscasts 建议使用部分加载 HEAD 标签之间显示的内容

            3) 如果您需要在加载事件后更改标题,请使用 javascript/ajax 调用来操作 DOM。

            也许您并不想更改title 元素标记的内容。也许您真的需要某种面包屑,以便您的用户始终知道他们在您网站的导航层次结构中的位置。虽然我对 goldberg 插件的操作做得很好,但我确信还有其他方法可以实现相同的功能。

            【讨论】:

              【解决方案10】:

              我使用 nifty_generator 的“nifty_layout”,它提供了一个标题变量,然后我可以在页面上使用:

              &lt;% title "Title of page" %&gt;

              我也可以使用&lt;% title "Title of page", false %&gt; 让标题只显示在浏览器标题中,而不是页面本身。

              【讨论】:

                【解决方案11】:

                您也可以在控制器的 before_filter 中设置它。

                # foo_controller.rb
                
                class FooController < ApplicationController
                
                  before_filter :set_title
                
                  private
                
                  def set_title
                    @page_title = "Foo Page"
                  end
                
                end
                
                # application.html.erb
                
                <h1><%= page_title %></h1>
                

                然后您可以在 set_title 方法中设置条件,为控制器中的不同操作设置不同的标题。很高兴能够在您的控制器中看到所有相关的页面标题。

                【讨论】:

                • 使用这种方式是(不幸的)常见做法,但将页面标题放在控制器中是不好的做法。页面标题与视图更相关。例如,如果您要提供 XML 替代视图,页面标题有什么相关性?
                • 是的,我同意这不是一个好主意,但它是一种替代方案,在某些需要从复杂条件中产生不同页面标题的情况下可能有用?
                • 嗯,我仍然认为它属于视图的助手。我的规则是查看 XML 版本,看看它是否需要该变量。如果没有,这是个人视图需要的东西。让您的控制器尽可能轻巧。
                【解决方案12】:

                【讨论】:

                • @CyleHunter 呵呵,显然不是。除非我的意思是“将此代码复制到您的项目中”;)
                【解决方案13】:

                简而言之,我可以这样写

                <%content_for :page_title do %><%= t :page_title, "Name of Your Page" %> <% end %>
                

                【讨论】:

                  【解决方案14】:

                  我喜欢 opsb 的方法,不过这个方法也行。

                  <% provide(:title,"ttttttttttttttttttZ") %>
                  <html>
                    <head><title><%= yield(:title) %></title></head>
                     <body></body>
                  </html>
                  

                  【讨论】:

                  • FWIW 这里的方法是 hartl 的书第 3 章中使用的方法,并不是说我推荐那本书,因为我发现它有点麻烦,但无论如何。
                  【解决方案15】:

                  我想确保始终为当前页面提供翻译。

                  这是我在app/views/layouts/application.html.erb 中想到的:

                      <title>
                        <%= translate("#{controller_name}.#{action_name}.site_title", raise: true) %>
                      </title>
                  

                  这将始终为当前视图寻找翻译,如果没有找到则引发错误。

                  如果你想要一个默认值,你可以这样做:

                      <title>
                        <%= translate("#{controller_name}.#{action_name}.site_title", 
                            default: translate(".site_title")) %>
                      </title>
                  

                  【讨论】:

                    【解决方案16】:

                    我想添加我非常简单的变体。

                    在ApplicationController中定义这个方法:

                      def get_title
                        @action_title_name || case controller_name
                                                when 'djs'
                                                  'Djs'
                                                when 'photos'
                                                  'Photos'
                                                when 'events'
                                                  'Various events'
                                                when 'static'
                                                  'Info'
                                                when 'club'
                                                  'My club'
                                                when 'news'
                                                  'News'
                                                when 'welcome'
                                                  'Welcome!'
                                                else
                                                  'Other'
                                              end
                      end
                    

                    之后,您可以从布局的标题标签中调用 get_title。您可以通过在您的操作中定义@action_title_name 变量来为您的页面定义更具体的标题。

                    【讨论】:

                    • 我猜您在过去六年中已经了解了separation of concerns 的概念,但我将把它放在那里,让其他可能对这个答案为什么会得到负分感到困惑的人。跨度>
                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2021-01-16
                    • 2013-05-27
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多