2010-08-11 7 views
15

Tôi đang cố gắng lấy tên bộ điều khiển và hành động dựa trên đường dẫn. Tôi có một con đường:Ruby on Rails: Nhận tên bộ điều khiển và hành động dựa trên đường dẫn

map.resources :permissions 

Tôi nghĩ rằng tôi có thể sử dụng:

ActionController::Routing::Routes.recognize_path "/permissions/1" 

Để có được một băm như:

{ :controller => "permissions", :action => "show" } 

Các băm thực tế mà trở lại là:

{ :controller => "permissions", :action => "1" } 

Làm cách nào để có được tên hành động chính xác thay vì chỉ thông qua ID của tôi? Điều phối viên phải có khả năng nhận được nó bằng cách nào đó hoặc Rails sẽ không hoạt động, nhưng tôi gặp khó khăn trong việc xác định cách nó được thực hiện.

Trả lời

2

Đây là những gì tôi đã kết thúc. Nó là xấu xí và phải có một cách tốt hơn, nhưng nó hoạt động ngay bây giờ. Nó xảy ra trong một before_filter để tôi có thể thấy nếu người dùng có quyền truy cập vào controller/action mà họ đang cố truy cập.

Tôi đã chọn sử dụng ủy quyền dựa trên tuyến đường thay vì ủy quyền dựa trên mô hình.

# Get method of current request 
method = options[:method] ? options[:method] : 'get' 

# Create a new request - hate this that is required 
env = Rack::MockRequest.env_for(url, {:method => method}) 
request = ActionController::Request.new(env) 

# For some reason, calling this fills in the controller/action information for the request 
# just using recognize_path doesn't work correctly with resources... 
ActionController::Routing::Routes.recognize(request) 

Sau đó, bạn truy cập vào bộ điều khiển và hành động với request.params [: controller] và request.params [: action].

Tất cả điều này sẽ không cần thiết nếu ActionController :: Routing :: Routes.recognize_path ("/ permissions/1") trả lại hành động chính xác.

11

Bạn thực sự làm gì sau? Nếu bạn thực sự sau khi tên hành động và tên điều khiển ... bạn chỉ có thể yêu cầu

controller.controller_name 

controller.action_name 

Điều đó giúp đỡ, hoặc bạn có thực sự cần phải phân tích một chuỗi để làm nó?

+2

tôi có ủy quyền route-có trụ sở tại chỗ . Về cơ bản, trong cơ sở dữ liệu của tôi, tôi cắm bộ điều khiển và hành động mà tôi chỉ muốn truy cập cho một số người dùng nhất định và coi chúng là quyền. Tôi gộp các quyền này vào vai trò và gán chúng cho người dùng của tôi. Khi một trang được bảo vệ được truy cập, một bộ lọc trước sẽ xác định xem người dùng có được phép trên trang đó hay không. Đó là làm việc tuyệt vời (bằng cách sử dụng các phương pháp bạn đề nghị). Bây giờ tôi cần phải tự động hiển thị một liên kết dựa trên việc người dùng có được phép truy cập vào trang phía sau liên kết hay không. Tôi không có quyền truy cập vào bộ điều khiển đích, chỉ có đường dẫn. –

10

Tính đến Rails 4 phương pháp để nhận ra con đường tại là Rails.application.routes.recognize_path như trái ngược với ActionController::Routing::Routes.recognize_path và nó trả về một hash của bộ điều khiển, hành động, và id như vậy:

Rails.application.routes.recognize_path(app.edit_somecontroller_path(1)) 
=> {:controller=>"somecontroller", :action=>"edit", :id=>"1"} 
+0

Lưu ý, cú pháp đó hoạt động nếu được gọi từ Bảng điều khiển Rails, nhưng khi tôi gọi nó từ application_controller, tôi đã phải xóa "ứng dụng". từ phần "app.edit_somecontroller ...". Vì vậy, ví dụ: Rails.application.routes.recognize_path (users_path) – JosephK