Bisakah saya mendapatkan nama pengontrol saat ini dalam tampilan?

205

Apakah ada cara untuk mencari tahu dari apa pengontrol saat ini dari dalam tampilan?

Untuk contoh mengapa saya ingin tahu ini: jika beberapa pengontrol berbagi tata letak yang sama, saya mungkin memiliki bagian dalam file tata letak ERB di mana saya ingin menyorot item menu halaman saat ini berdasarkan pada pengontrol.

Mungkin itu pendekatan yang buruk. Jika demikian, apa cara yang lebih disukai untuk melakukan ini?

Saya tertarik untuk mengetahui tentang cara mendapatkan nama dari pengontrol saat ini.

(Jelas saya bisa memasukkan sesuatu seperti @controller_name = 'users'pada masing-masing controller; tapi sepertinya itu semacam hal yang sudah dilakukan Rails di belakang layar. Jadi saya hanya ingin tahu apakah ada cara built-in.)

Dan Tao
sumber

Jawaban:

246

controller_name memegang nama pengontrol yang digunakan untuk melayani tampilan saat ini.

Anubhaw
sumber
94
Sebenarnya adalah praktik buruk untuk digunakan paramsdalam pandangan. Silakan gunakan controller_namesebagai gantinya
coorasse
1
@ campasse benar, pasti informasinya ada di sana, tetapi mengandalkan controller_name lebih baik
Cec
261

Dalam Rails Guides, tertulis:

Params hash akan selalu berisi kunci: controller dan: action, tetapi Anda harus menggunakan metode controller_name dan action_name sebagai gantinya untuk mengakses nilai-nilai ini

Parameter ActionController

Jadi katakanlah Anda memiliki kelas CSS active, yang harus dimasukkan dalam tautan apa pun yang halamannya saat ini terbuka (mungkin agar Anda dapat gaya berbeda). Jika Anda memiliki static_pagespengontrol dengan abouttindakan, Anda dapat menyorot tautan seperti di tampilan Anda:

<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>
Musili
sumber
21
Jika Anda memiliki pengontrol di belakang namespace seperti ini: Admin::Ordersmaka controller_namedan params[:controller]akan menjadi "orders"dan "admin/orders"masing - masing.
Viktor Fonic
8
Aku hanya mencoba untuk menggunakan ini dan Admin::UsersControllerbenar-benar memiliki controller_namedari usersdan controller_pathdari admin/usersdalam Rails 4.1.0.
Brandon
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) %>

referensi

Thaha kp
sumber
1
Untuk mendapatkan id, ActionController :: Routing :: Routes tidak lagi berfungsi. Anda dapat melakukan ini: <% = request.path_parameters [: id]%>
rmcsharry
2

controller_pathmemegang jalur controller yang digunakan untuk melayani tampilan saat ini. (yaitu:) admin/settings.

dan

controller_namememegang nama pengontrol yang digunakan untuk melayani tampilan saat ini. (yaitu:) settings.

Ricky Notaro-Garcia
sumber
0

Jika Anda ingin menggunakan semua stylesheet di aplikasi Anda, cukup tambahkan baris ini di application.html.erb. Masukkan di dalam <head> tag

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

Juga, untuk menentukan kelas CSS yang sama pada pengontrol yang berbeda
Tambahkan baris ini di bodyof application.html.erb

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

Jadi, sekarang misalnya saya ingin mengubah ptag di controller 'home' dan action 'index'. index.scssFile di dalam menambahkan.

.nameOfController-nameOfAction <tag> { }

 .home-index p {
        color:red !important;
      }
Sami
sumber