วิธีที่ดีที่สุดในการสร้างชื่อที่กำหนดเองสำหรับหน้าในแอพ Rails โดยไม่ต้องใช้ปลั๊กอินคืออะไร?
วิธีที่ดีที่สุดในการสร้างชื่อที่กำหนดเองสำหรับหน้าในแอพ Rails โดยไม่ต้องใช้ปลั๊กอินคืออะไร?
คำตอบ:
ในมุมมองของคุณทำสิ่งนี้:
<% 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_for
และyield(:title)
ข้อความในวิธีการช่วยเหลือ (ตามที่คนอื่น ๆ แนะนำไว้แล้ว) อย่างไรก็ตามในกรณีง่าย ๆ เช่นนี้ฉันต้องการใส่รหัสที่จำเป็นลงในมุมมองเฉพาะโดยไม่ต้องมีผู้ช่วยที่กำหนดเอง
<h1><%= content_for(:title, "Title for specific page") %></h1>
ฉันไม่เห็นผลลัพธ์ใด ๆ ใน DOM ของฉัน (เช่นฉัน<h1></h1>
ไม่มีเนื้อหาอยู่ในนั้น) อย่างไรก็ตามฉัน<title>Title for specific page</title>
ทำงานอย่างถูกต้อง ความคิดใด ๆ
นี่เป็นตัวเลือกง่าย ๆ ที่ฉันชอบใช้
ในรูปแบบของคุณ
<head>
<title><%= @title %></title>
</head>
และที่ด้านบนสุดของเทมเพลตหน้า (บรรทัดแรก)
<% @title="Home" %>
เนื่องจากวิธีการแยกวิเคราะห์เท็มเพลตโครงร่างและหน้าเทมเพลต @ title = "Home" จะถูกประเมินก่อนที่จะแสดงเลย์เอาต์
แนวทางปฏิบัติที่ดีที่สุดคือการใช้ content_for
ขั้นแรกให้เพิ่มวิธีการช่วยเหลือสองสามวิธี (เช่นติดใน app / ผู้ช่วยเหลือ / 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 สำหรับชื่อของคุณและทำให้คอนโทรลเลอร์ของคุณดีและไม่มีตัวแปร pesky @title
@content_for_title
อย่างไร
@content_for_title
อะไร (content_for(:title) + ' — ' if content_for?(:title)).to_s + 'My Cool Site'
ควรจะเป็น จากนั้นตั้งค่าจากมุมมองของคุณเพียง<% content_for :title, 'My Page Title' %>
@content_for_title
เป็นสิ่งที่เกิดขึ้นเมื่อคุณใช้content_for
ในขณะที่ความคิดเห็นนี้ถูกเขียน ฉันเชื่อว่านี่ไม่ใช่กรณีอีกต่อไป แต่ฉันไม่ได้ดูเมื่อเร็ว ๆ นี้ ความคิดเห็นของ Toby J นั้นถูกต้องสำหรับ Rails ในปัจจุบัน ฉันจะอัปเดตคำตอบดั้งเดิมของฉัน
การปรับปรุง@opsbและรูปแบบที่สมบูรณ์ยิ่งขึ้นของ@FouZ :
ในapplication.html.erb
:
<title><%= @title || "Default Page Title" %></title>
ในไฟล์มุมมอง erb หรือตัวควบคุม:
<% @title = "Unique Page Title" %>
มองไปที่content_for
: http://railscasts.com/episodes/8
หากไม่มีรายละเอียดเพิ่มเติมเกี่ยวกับกรณีการใช้งานหรือข้อกำหนดที่คุณพยายามจะทำให้พอใจฉันสามารถนึกถึงทางเลือกอื่น ๆ :
1) สลับหัวเรื่องในหนึ่งในหน้าเลย์เอาต์ของคุณและใช้วิธีการช่วยเหลือที่เก็บไว้ใน application_helper.rb
<title><%= custom_title %></title>
วิธีการนี้จะให้ชื่อเฉพาะสำหรับแต่ละหน้าเลย์เอาต์
2) Railscasts แนะนำให้ใช้บางส่วนเพื่อโหลดสิ่งที่แสดงระหว่างแท็ก HEAD
3) ใช้การเรียก javascript / ajax เพื่อจัดการ DOM หากคุณต้องการเปลี่ยนชื่อหลังจากเหตุการณ์โหลด
บางทีคุณอาจไม่ต้องการเปลี่ยนเนื้อหาที่แท็กtitle
องค์ประกอบ บางทีคุณอาจต้องการ breadcrumb บางประเภทเพื่อให้ผู้ใช้ของคุณรู้อยู่เสมอว่าพวกเขาอยู่ที่ไหนเกี่ยวกับลำดับชั้นการนำทางของไซต์ของคุณ ในขณะที่ฉันทำดีกับปลั๊กอินทองคำฉันแน่ใจว่ามีวิธีอื่นในการดึงฟังก์ชันการทำงานเดียวกัน
ฉันใช้ "nifty_layout" ของ nifty_generator ซึ่งมีตัวแปรชื่อเรื่องที่ฉันสามารถเรียกใช้ในหน้านั้นโดยใช้:
<% title "Title of page" %>
ฉันยังสามารถ<% title "Title of page", false %>
ให้ผู้ใช้มีชื่อเรื่องเพียงแค่แสดงในชื่อเบราว์เซอร์และไม่ได้อยู่ในหน้านั้น
คุณสามารถตั้งค่ามันใน 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เพื่อตั้งชื่อเรื่องที่แตกต่างกันสำหรับการกระทำที่แตกต่างกันในคอนโทรลเลอร์ ยินดีที่ได้เห็นชื่อหน้าทั้งหมดที่เกี่ยวข้องภายในคอนโทรลเลอร์ของคุณ
ฉันใช้ ปลั๊กอินนี้ผู้ช่วย Rails เหล่านี้ที่ฉันเขียน: http://web.archive.org/web/20130117090719/http://henrik.nyh.se/2007/11/my-rails-title-helpers/
วิธีการสำหรับการเอียงหน้าโดยใช้วิธี content_for และบางส่วน
1. ชื่อบางส่วน: _page_title.html.erb
<%content_for :page_title do %>
<%=title%>
<%end%>
2. การใช้งานใน 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'%>
ในระยะสั้นฉันสามารถเขียนสิ่งนี้ลงได้ดังนี้
<%content_for :page_title do %><%= t :page_title, "Name of Your Page" %> <% end %>
ฉันชอบวิธีของ opsb แต่วิธีนี้ใช้ได้เช่นกัน
<% provide(:title,"ttttttttttttttttttZ") %>
<html>
<head><title><%= yield(:title) %></title></head>
<body></body>
</html>
วิธีที่ดีที่สุด / สะอาดในการทำสิ่งนี้:
<title><%= @page_title or 'Page Title' %></title>
ฉันต้องการที่จะเพิ่มตัวแปรที่เรียบง่ายของฉัน
ใน 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 ในการทำงานของคุณ
<title><%= (yield(:title) + " - " unless yield(:title).blank?).to_s + "This is always shown" %></title>
ในเค้าโครงและ<% content_for :title, "Conditional title" %>
ในมุมมอง