Rails - nama aksi pengontrol ke string


160

Saya punya pertanyaan Rails.

Bagaimana cara mendapatkan nama tindakan pengontrol di dalam tindakan pengontrol?

Misalnya, alih-alih

def create
  logger.info("create")
end

Saya ingin menulis sesuatu seperti

def create
  logger.info(this_def_name)
end

Apa cara untuk mendapatkannya this_def_name?

Jawaban:


337

Rel 2.X :@controller.action_name

Rel 3.1.x : controller.action_name,action_name

Rel 4.X :action_name


5
Atau 'controller.action_name' di Rails 3.0. Ini adalah cara terbaik untuk mengakses nama tindakan dalam tampilan.
emk

2
Jika Anda ingin menggunakan ini before_filterdengan blok, lakukan before_filter { |controller| ... }. stackoverflow.com/questions/2669663/…
Benjamin Oakes

3
FYI, action_namebekerja di Rails 3.2.13, dan controller.action_nametidak.
Zach

rails 2.3.XX dan @ controller.action_name tidak berfungsi, Anda hanya perlu menggunakan action_name untuk versi ini.
mkralla11

Apakah ada versi simbol?
Bogdan Gusiev

34

Dalam kasus spesifik tindakan Rails (sebagai lawan dari kasus umum mendapatkan nama metode saat ini) yang dapat Anda gunakan params[:action]

Atau Anda mungkin ingin melihat ke kustomisasi format log Rails sehingga nama tindakan / metode dimasukkan oleh format daripada yang ada di pesan log Anda.


8
Anda dulu bisa mendapatkan tindakan saat ini dengan memanggil action_name, saya tidak yakin apakah itu masih berfungsi, tapi saya selalu berpikir itu sedikit lebih baik daripada meminta params.
jonnii

Hanya untuk memperjelas, ini "controller.action_name" atau "params [: action]", jadi Anda mungkin melakukan <% jika controller.action_name == 'new'%> dalam tampilan. Ini bekerja untuk saya di Rails 3.2.
dmonopoly

1
Anda juga bisa mendapatkan nama pengontrol melalui params [: controller]
Ash Blue

action_name == 'new'(tidak diperbaiki) masih berfungsi untuk saya di Rails 3.2
Brendon Muir

17

nama pengontrol:

<%= controller.controller_name %>

return => 'pengguna'

nama tindakan:

<%= controller.action_name %>

return => 'tampilkan'

Indo:

<%= ActionController::Routing::Routes.recognize_path(request.url)[:id] %>

return => '23'


7

Cuplikan ini berfungsi untuk Rails 3

class ReportsController < ApplicationController

  def summary
    logger.debug self.class.to_s + "." + self.action_name
  end

end

akan dicetak

. . .
ReportsController.summary
. . .


3

jawaban mikej sangat tepat dan membantu, tetapi hal yang saya juga ingin tahu adalah bagaimana mendapatkan nama metode saat ini di rel.

menemukan itu mungkin dengan self.current_method

mudah ditemukan di http://www.ruby-forum.com/topic/75258


-4

Saya melakukan hal yang sama. Saya melakukannya di helper controller, kode saya adalah:

def get_controller_name
  controller_name    
end


def get_action_name
  action_name   
end

Metode ini akan mengembalikan nama contoller dan action saat ini. Semoga ini bisa membantu


39
Membingungkan Mengapa membungkus controller_name, yang merupakan metode yang mengembalikan nama pengontrol saat ini, dalam metode lain yang hanya memanggil controller_name ? Mengapa tidak menelepon saja controller_namedan selesai saja?
piersadrian
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.