ฉันจะได้รับชื่อของตัวควบคุมปัจจุบันในมุมมองได้หรือไม่?


205

มีวิธีที่จะคิดออกว่าตัวควบคุมปัจจุบันมาจากภายในมุมมองหรือไม่?

สำหรับตัวอย่างของสาเหตุที่ฉันต้องการทราบว่า: หากคอนโทรลเลอร์หลายตัวใช้เลย์เอาต์เดียวกันฉันอาจมีส่วนหนึ่งในไฟล์ ERB ของเลย์เอาต์ที่ฉันต้องการไฮไลต์รายการเมนูของเพจปัจจุบันตามตัวควบคุม

อาจเป็นวิธีที่ไม่ดี ถ้าเป็นเช่นนั้นวิธีที่ได้รับความนิยมมากขึ้นในการทำเช่นนี้คืออะไร?

ฉันสนใจที่จะทราบเกี่ยวกับการตั้งชื่อให้กับคอนโทรลเลอร์ปัจจุบันด้วยวิธีใดวิธีหนึ่ง

(เห็นได้ชัดว่าฉันสามารถใส่อะไรก็ได้ลงไป@controller_name = 'users'ในคอนโทรลเลอร์แต่ละอัน แต่นั่นดูเหมือนว่าสิ่งที่ Rails จะทำไว้เบื้องหลังแล้วดังนั้นฉันแค่สงสัยว่ามีวิธีในตัว)

คำตอบ:


246

controller_name ถือชื่อของตัวควบคุมที่ใช้ในการให้บริการมุมมองปัจจุบัน


94
ที่จริงคือการปฏิบัติที่ดีที่จะใช้paramsในมุมมอง กรุณาใช้controller_nameแทน
coorasse

1
@coorasse ที่เหมาะสมเพื่อตรวจสอบว่าข้อมูลที่จะมี แต่อาศัย controller_name จะดีกว่า
Cec

261

ในคู่มือ Rails มันพูดว่า:

แฮช params จะมี: controller และ: action keys เสมอ แต่คุณควรใช้เมธอดcontroller_nameและaction_nameแทนเพื่อเข้าถึงค่าเหล่านี้

พารามิเตอร์ ActionController

ดังนั้นสมมติว่าคุณมีคลาส CSS activeซึ่งควรแทรกในลิงค์ใด ๆ ที่หน้านั้นเปิดอยู่ (อาจทำให้สไตล์แตกต่างออกไป) หากคุณมีstatic_pagesคอนโทรลเลอร์พร้อมaboutแอ็คชันคุณสามารถไฮไลต์ลิงก์เช่นนั้นในมุมมองของคุณ:

<li>
  <a class='button <% if controller.controller_name == "static_pages" && controller.action_name == "about" %>active<%end%>' href="https://stackoverflow.com/about">
      About Us
  </a>
</li>

21
หากคุณมีการควบคุมของคุณที่อยู่เบื้องหลัง namespace เช่นนี้: Admin::Ordersแล้วcontroller_nameและparams[:controller]จะเป็น"orders"และ"admin/orders"ตามลำดับ
Viktor Fonic

8
ฉันเพียงแค่พยายามที่จะใช้นี้และAdmin::UsersControllerจริงมีcontroller_nameของusersและcontroller_pathของadmin/usersใน Rails 4.1.0
แบรนดอน

89
#to get controller name:
<%= controller.controller_name %>
#=> 'users'

#to get action name, it is the method:
<%= controller.action_name %>
#=> 'show'


#to get id information:
<%= ActionController::Routing::Routes.recognize_path(request.url)[:id] %>
#=> '23'

# or display nicely
<%= debug Rails.application.routes.recognize_path(request.url) %>

การอ้างอิง


1
เพื่อรับ ID, ActionController :: การกำหนดเส้นทาง :: เส้นทางไม่ทำงานอีกต่อไป คุณสามารถทำได้: <% = request.path_parameters [: id]%>
rmcsharry

2

controller_pathเก็บเส้นทางของตัวควบคุมที่ใช้เพื่อให้บริการมุมมองปัจจุบัน (เช่น: admin/settings)

และ

controller_nameถือชื่อของตัวควบคุมที่ใช้ในการให้บริการมุมมองปัจจุบัน (เช่น: settings)


0

หากคุณต้องการใช้สไตล์ชีททั้งหมดในแอปของคุณเพียงเพิ่มบรรทัดนี้ใน application.html.erb ใส่ไว้ใน<head> แท็ก

  <%= stylesheet_link_tag  controller.controller_name , media: 'all', 'data-turbolinks-track': 'reload' %>

นอกจากนี้หากต้องการระบุ CSS คลาสเดียวกันบนคอนโทรลเลอร์อื่นให้
เพิ่มบรรทัดนี้ในbodyapplication.html.erb

  <body class="<%= controller.controller_name %>-<%= controller.action_name %>">

ตัวอย่างเช่นตอนนี้ฉันต้องการเปลี่ยน pแท็กในการกระทำ 'home' controller และ 'index' index.scssไฟล์ภายในเพิ่ม

.nameOfController-nameOfAction <tag> { }

 .home-index p {
        color:red !important;
      }
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.