2011-12-31 34 views
28

Trong đường ray, tôi có thể lấy tên của bộ điều khiển hiện tại thông qua controller_name và hành động hiện tại bằng cách gọi action_name. Tôi đang tìm phản hồi thời gian chạy tương tự để tìm nạp thông tin sau:Làm thế nào để có được danh sách các bộ điều khiển và hành động trong ruby ​​trên đường ray?

  1. Danh sách tất cả các bộ điều khiển trong ứng dụng.
  2. Danh sách tất cả các hành động trong một bộ điều khiển đã cho.

Ví dụ: Tôi là Bộ điều khiển sản phẩm có hành động "thêm" và "chỉnh sửa". Tôi có thể kéo tên của những hành động này theo chương trình để hiển thị cho người dùng những hoạt động nào được hỗ trợ không?

Tôi đã xem xét một phương thức yêu cầu sử dụng ActionController::Routing::Routes.named_routes.routes.each nhưng tôi không thể làm việc đó. Tôi đã nhận lỗi không đổi ActionDispatch::Routing::Routes khi tôi sử dụng nó.

Nếu có bất kỳ hướng dẫn hay tài liệu nào có thể giúp tôi hiểu khả năng phản chiếu của đường ray. Tôi đã tìm kiếm nhưng tôi chủ yếu có các blog liên quan đến phản ánh bản ghi hoạt động. Tôi đang tìm một cái gì đó cho phép tôi nhận được thông tin về bộ điều khiển và hành động/phương pháp tại thời gian chạy.
Cảm ơn,

Tabrez

+0

Bạn đang làm điều này tại thời gian chạy hoặc trong một công việc cào. thời gian chạy là một ý tưởng tồi. Công việc của Rake rất dễ thực hiện. – drhenner

+0

Ý của bạn là "các tuyến đường cào"? Tôi đang tìm kiếm thứ gì đó trong thời gian chạy. Tôi không cần thông tin mở rộng mà rake tuyến đường đầu ra. Tôi chỉ cần các tên bộ điều khiển, mà tôi giả định phải có sẵn như là một bộ sưu tập. Là một noob để rails, tôi chỉ không biết những gì các đối tượng bối cảnh có thể truy cập trong đường ray khi chạy. – Tabrez

+0

Tìm thấy câu hỏi tương tự tại đây, http://stackoverflow.com/questions/1564278/how-to-programmatically-list-all-controllers-in-rails – nkm

Trả lời

92

Cách dễ nhất để có được một danh sách các lớp điều khiển là:

ApplicationController.descendants 

Tuy nhiên, như các lớp được nạp một cách lười biếng, bạn sẽ cần phải tải háo hức tất cả các lớp học của bạn trước bạn làm điều này Hãy ghi nhớ rằng phương pháp này sẽ mất thời gian, và nó sẽ làm chậm khởi động của bạn:

Rails.application.eager_load! 

Để có được tất cả các hành động trong một bộ điều khiển, sử dụng action_methods

PostsController.action_methods 

này sẽ trả về một Set chứa một danh sách tất cả các phương thức trong bộ điều khiển của bạn là "hành động" (sử dụng cùng một Rails logic sử dụng để quyết định xem một phương thức là một hành động hợp lệ để định tuyến đến).

+0

Đó chính xác là những gì tôi đang tìm kiếm. Cảm ơn rất nhiều! Có bất kỳ tài nguyên/hướng dẫn/cuốn sách đường ray cụ thể nào có thể giúp hiểu được các loại vấn đề này hay không; cụ thể hơn vòng đời và các đối tượng thời gian chạy mà đường ray đi qua? Bất kỳ con trỏ nào cũng sẽ là một trợ giúp lớn vì tôi mới làm quen với đường ray. – Tabrez

+1

Điều đáng nói đến là bằng cách gọi '.action_methods' bạn chỉ nhận được danh sách các phương thức công khai (= actions) được định nghĩa trong một lớp. Vì Rails có thể hiển thị mẫu mà không có phương thức thực tế trong bộ điều khiển nên nó có thể dẫn đến lỗ hổng bảo mật trong ứng dụng. –

1

PostsController.action_methods sẽ trả lại tất cả những hành động của PostsController bao gồm di truyền, nó không phải là những gì tôi muốn, tôi thấy PostsController.instance_methods(false), mà sẽ trả về tất cả các phương pháp thể hiện của PostsController và không bao gồm di truyền, chính xác những gì tôi muốn.

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