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.