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?

Pavel K.
sumber

Jawaban:

337

Rel 2.X :@controller.action_name

Rel 3.1.x : controller.action_name,action_name

Rel 4.X :action_name

JellicleCat
sumber
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.

mikej
sumber
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'

membuang
sumber
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
. . .

Vladimir Kroz
sumber
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

Pavel K.
sumber
-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

Rushabh Ajay Hathi
sumber
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