2012-04-23 33 views
9

Tôi đang cố gắng thiết lập tuyến đường cho API di động, cần có api-path được phiên bản. Tôi đã có thể thực hiện tác vụ Auth trên thiết bị di động, được triển khai trong Bộ điều khiển riêng biệt AuthController nằm ở /controllers/api/v1/mobile/.Lỗi định tuyến: hằng số không được khởi tạo

dụ Cách sử dụng:

myapp.com/api/v1/mobile/auth 

Nhưng bây giờ tôi muốn đăng ký hiện ressources-lý của tôi vào đó đường dẫn mẫu như thêm api tìm đường khác. Bê tông: đây sẽ là TasksController được đặt tại /controllers/tracker/tasks_controller.rb. Vì vậy, tôi đã thêm một tuyến đường di động để các tuyến đường nét:

# routes.rb 
namespace :tracker, path: 'timetracking' do 
    resources :tasks, 'jobs' 
end 

namespace :api do 
    namespace :v1 do 
    namespace :mobile do 
     resources :auth, :only => [:create, :destroy] 

     namespace :tracker do #added mobile route 
     resource :tasks, controller: 'tracker/tasks', as: :mobile_tasks 
     end 
    end 
    end 
end 

Nhưng khi tôi gọi myapp.com/api/v1/mobile/tracker/tasks nó kết quả trong một lỗi thông điệp:

Routing Error 
uninitialized constant Api::V1::Mobile::Tracker 

Tôi đặc biệt thêm bí danh : mobile_tasks vào tuyến đường này, để tránh bất kỳ xung đột nào với tuyến đường tác vụ gốc ở trên. Bất kỳ ý tưởng, làm thế nào để thiết lập bộ điều khiển đúng cho tuyến đường này?

Update # 1

Xác định tuyến đường này như một phạm vi thay vì một không gian tên, không làm việc là tốt.

scope "/api/v1/mobile/tracker" do 
    resources :tasks, controller: 'tracker/tasks', as: :mobile_tasks 
end 

Nhưng lần này, nó thậm chí không giải quyết được chính đường dẫn đường.

Routing Error 
No route matches [GET] "/api/v1/mobile/tracker/tasks" 

tôi giả sử nó có thể là một vấn đề, đó là con đường di động-api thêm tôi cố gắng để trỏ đến một hoàn toàn khác nhau namespace tracker.

Trả lời

19

Theo http://guides.rubyonrails.org/routing.html#controller-namespaces-and-routing bạn nên sử dụng phạm vi thay vì không gian tên.

Nếu bạn muốn định tuyến /admin/posts-PostsController (không có Admin:: module prefix), bạn có thể sử dụng:

scope "/admin" do 
    resources :posts, :comments 
end 
+0

Xin chào Krists, cảm ơn câu trả lời của bạn. Tôi đã cập nhật câu hỏi-văn bản của tôi với đường ray-đầu ra liên quan đến đề xuất của bạn. – loybert

+1

Bạn đã thử lệnh 'rake routes' để in ra tất cả các tuyến được xác định theo thứ tự và tên khớp? Nó sẽ giúp bạn gỡ lỗi vấn đề này. – Krists

+0

thx cho gợi ý tốt với 'các tuyến đường rake'. đã giúp tôi làm việc này :) – loybert

0

Cuối câu trả lời, nhưng vẫn có thể hữu ích:

scope '/v1' do 
    resources :articles, module: 'v1' 
end 

khiển

# app/controller/v1/articles_controller.rb 
class V1::ArticlesController < ApplicationController 

end 

Bây giờ bạn sẽ có thể truy cập url này:

http://localhost:3000/v1/articles

0

Thêm câu trả lời này để có được sự rõ ràng về phạm vi không gian tên &.

Khi bạn sử dụng không gian tên, nó sẽ thêm tiền tố đường dẫn URL cho các tài nguyên được chỉ định và cố gắng định vị bộ điều khiển theo mô-đun có tên giống như không gian tên.

# config/routes.rb 
namespace :admin do 
    resources :posts, only: [:index] 
end 

# rake routes 
Prefix Verb URI Pattern     Controller#Action 
admin_posts GET /admin/posts(.:format) admin/posts#index 

Khi chúng tôi thêm phạm vi, nó sẽ chỉ ánh xạ hành động bộ điều khiển cho các mẫu phạm vi nhất định. Không cần phải xác định bộ điều khiển dưới bất kỳ mô-đun nào.

# config/routes.rb 
scope :admin do 
    resources :posts, only: [:index] 
end 

# rake routes 
Prefix Verb URI Pattern     Controller#Action 
admin_posts GET /admin/posts(.:format) posts#index 

Lưu ý rằng, bộ điều khiển chỉ là bộ điều khiển bài viết không có bất kỳ không gian tên mô-đun nào.

Nếu chúng ta thêm một tùy chọn path phạm vi nó sẽ lập bản đồ với bộ điều khiển với các tùy chọn đường dẫn cụ thể như sau

# config/routes.rb 
scope module 'admin', path: 'admin' do 
    resources :posts, only: [:index] 
end 

# rake routes 
Prefix Verb URI Pattern     Controller#Action 
admin_posts GET /admin/posts(.:format) admin/posts#index 

Lưu ý rằng bộ điều khiển hiện đang được mô-đun admin.

Bây giờ, nếu chúng ta muốn thay đổi tên phương thức đường dẫn để xác định tài nguyên, chúng tôi có thể thêm tùy chọn as vào phạm vi.

# config/routes.rb 
namespace module: 'admin', path: 'admin', as: 'root' do 
    resources :posts, only: [:index] 
end 

# rake routes 
Prefix Verb URI Pattern     Controller#Action 
root_posts GET /admin/posts(.:format) admin/posts#index 

Bạn có thể thấy thay đổi trong động từ tiền tố.

Hy vọng nó sẽ giúp người khác.

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