2009-08-07 30 views
127

Tôi có câu hỏi Rails.Rails - điều khiển tên hành động thành chuỗi

Làm cách nào để có tên của hành động bộ điều khiển bên trong hành động của bộ đ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ì đó giống như

def create 
    logger.info(this_def_name) 
end 

một cách để có được this_def_name là gì?

Trả lời

287

Rails 2.X: @controller.action_name

Rails 3.1.x: controller.action_name, action_name

Rails 4.X: action_name

+5

Hoặc' controller.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

controller.action_name hoạt động trong Rails 3.2 cũng –

+2

Nếu bạn muốn sử dụng điều này trong một 'before_filter' với một khối, làm' before_filter {| controller | ...} '. http://stackoverflow.com/questions/2669663/rails-before-filter-and-action-identification –

33

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

Hoặc bạn có thể muốn xem xét tùy biến Rails log định dạng để hành động/tên phương thức được bao gồm bởi định dạng thay vì nó nằm trong thông điệp tường trình của bạn.

+8

Bạn sử dụng để có thể nhận được các hành động hiện tại bằng cách gọi ACTION_NAME, tôi không chắc chắn nếu điều đó vẫn hoạt động, nhưng tôi luôn nghĩ đó là một chút đẹp hơn truy vấn các thông số. – jonnii

+1

action_name vẫn hoạt động và đồng ý nó đẹp hơn một chút :) – mikej

+0

Điều này không hiệu quả đối với tôi trong đường ray 3 nữa. –

2

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à cách lấy tên phương thức hiện tại trong đường ray.

phát hiện ra nó có thể với self.current_method

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

-4

Tôi cũng làm như vậy. Tôi đã làm điều đó trong bộ đ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 pháp này sẽ trả về tên hành động và contoller hiện tại. Hy vọng nó giúp

+34

Khó hiểu. Tại sao lại 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 mà chỉ * gọi *' controller_name'? Tại sao không chỉ gọi 'controller_name' và được thực hiện với nó? – piersadrian

6

đoạn này làm việc cho Rails 3

class ReportsController < ApplicationController 

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

end 

sẽ in

. . .
ReportsController.summary
. . .

10

tên điều khiển:

<%= controller.controller_name %> 

trở lại => tên

hành động 'của người sử dụng:

<%= controller.action_name %> 

trở lại => 'show'

id:

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

trở lại => '23'

Các vấn đề liên quan