Rails - tên hành động của bộ điều khiển thành chuỗi


160

Tôi có một câu hỏi Rails.

Làm cách nào để có được tên của hành động điều khiển bên trong hành động của trình điều khiển?

Ví dụ, thay vì

def create
  logger.info("create")
end

Tôi muốn viết một cái gì đó như

def create
  logger.info(this_def_name)
end

Một cách để có được là this_def_namegì?

Câu trả lời:


337

Đường ray 2.X :@controller.action_name

Đường ray 3.1.X : controller.action_name,action_name

Đường ray 4.X :action_name


5
Hoặc 'control.action_name' trong Rails 3.0. Đây là cách tốt nhất để truy cập tên hành động trong chế độ xem.
emk

2
Nếu bạn muốn sử dụng cái này trong before_filtermột khối, hãy làm before_filter { |controller| ... }. stackoverflow.com/questions/2669663/ Mạnh
Benjamin Oakes

3
FYI, action_namehoạt động trong Rails 3.2.13, và controller.action_namekhông.
Zach

rails 2.3.XX và @ control.action_name không hoạt động, bạn phải sử dụng chỉ action_name cho (các) phiên bản này.
mkralla11

Có một phiên bản biểu tượng?
Bogdan Gusiev

34

Trong trường hợp cụ thể của hành động Rails (trái ngược với trường hợp chung là lấy tên phương thức hiện tại), bạn có thể sử dụng params[:action]

Ngoài ra, bạn có thể muốn xem xét việc tùy chỉnh định dạng nhật ký Rails để tên hành động / phương thức được bao gồm bởi định dạng thay vì trong thông điệp tường trình của bạn.


8
Bạn đã từng có thể có được hành động hiện tại bằng cách gọi action_name, tôi không chắc liệu nó có còn hoạt động không, nhưng tôi luôn nghĩ rằng nó đẹp hơn một chút so với truy vấn các thông số.
jonnii

Chỉ cần làm rõ, đó là "control.action_name" hoặc "params [: action]", vì vậy bạn có thể thực hiện <% if controller.action_name == 'new'%> trong chế độ xem. Nó hoạt động với tôi trong Rails 3.2.
độc quyền

1
Bạn cũng có thể lấy tên bộ điều khiển thông qua params [: controller]
Ash Blue

action_name == 'new'(chưa được chỉnh sửa) vẫn hoạt động với tôi trong Rails 3.2
Brendon Muir

17

tên bộ điều khiển:

<%= controller.controller_name %>

trả lại => 'người dùng'

tên hành động:

<%= controller.action_name %>

trở lại => 'hiển thị'

Tôi:

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

trở lại => '23'


7

Đoạn mã này hoạt động cho Rails 3

class ReportsController < ApplicationController

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

end

sẽ in

. . .
Báo cáoControll.summary
. . .


3

Câu trả lời của mikej rất chính xác và hữu ích, nhưng điều tôi cũng muốn biết là làm thế nào để có được tên phương thức hiện tại trong đường ray.

phát hiện ra điều đó là có thể với self.cien_method

dễ dàng tìm thấy tại http://www.ruby-forum.com/topic/75258


-4

Tôi chỉ làm như vậy. Tôi đã làm điều đó trong trình điều khiển trợ giúp, mã của tôi là:

def get_controller_name
  controller_name    
end


def get_action_name
  action_name   
end

Những phương thức này sẽ trả về tên hành động và tên hành động hiện tại. Hy vọng nó giúp


39
Gây nhầm lẫn. Tại sao bọc controller_name, là một phương thức trả về tên của bộ điều khiển hiện tại, trong một phương thức khác chỉ gọi controller_name ? Tại sao không chỉ gọi controller_namevà được thực hiện với nó?
piersadrian
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.