2012-08-22 28 views
5

Tôi có tuyến đường này:Không phù hợp với lộ trình trong bộ điều khiển spec cho tuyến đường phức tạp của tôi

resources :items, path: 'feed', only: [:index], defaults: { variant: :feed } 

đó được lồng trong api và v1 namespace. (tham số request_source đến từ không gian tên Api).

Tôi muốn kiểm tra hành động chỉ mục trong thông số bộ điều khiển của mình. Tôi cố gắng:

get :feed, community_id: community.id, :request_source=>"api" 

không làm việc, và vì vậy không:

get :index, community_id: community.id, :request_source=>"api", variant: 'feed' 

nói:

ActionController::RoutingError: 
    No route matches {:community_id=>"14", :request_source=>"api", :variant=>"feed", :controller=>"api/v1/items"} 

------- EDIT -------- -

Lý do tại sao tôi muốn sử dụng biến thể để gửi thông số cho bộ điều khiển là vì tôi có tất cả các tuyến đường sau:

resources :items, path: 'feed', only: [:index], defaults: { variant: 'feed' } 
    resources :items, path: 'popular', only: [:index], defaults: { variant: 'popular' } 

Sau đó, trong ItemsController, tôi có một trước khi lọc "get_items" cho Mà action index không:

def get_items 
    if params[:variant] == 'feed' 
    .... 
elsif params[:variant] == 'popular' 
    .... 
end 
+0

các vết lùi về ngoại lệ là gì? –

Trả lời

2

Dường như vấn đề xuất phát từ việc xác định defaults: { variant: :feed }. Bạn có thể vui lòng xây dựng những gì bạn đang cố gắng để thực hiện với điều đó.

Tôi tạo ra một ứng dụng để kiểm tra những gì bạn có và những điều sau đây config/routes.rb

namespace :api do 
    namespace :v1 do 
    resources :items, path: 'feed', only: :index 
    end 
end 

tôi nhận này khi tôi chạy rake routes.

$ rake routes 
api_v1_items GET /api/v1/feed(.:format) api/v1/items#index 

Cập nhật: để thiết lập mặc định cho biến params kiếm cái gì đó không được định nghĩa trong con đường bạn có thể sử dụng trong các hành động của bạn.

params[:variant] ||= 'feed' 

Cập nhật 2: bạn có điều kiện có thể gán params[:variant] trong một trước khi lọc như vậy.

class ItemsController < ApplicationController 
    before_filter :get_variant 

    # or more simply 
    # before_filter lambda { params[:variant] ||= 'feed' } 

    def index 
    render text: params[:variant] 
    end 

private  

    def get_variant 
    # make sure we have a default variant set 
    params[:variant] ||= 'feed' 
    end 
end 
+1

Chúng tôi có nhiều tuyến đường đi tới mụC# index. mặc định: {variant:: xxx} được sử dụng để đặt thông số sẽ xác định hành vi của hành động chỉ mục dựa trên tuyến đường được yêu cầu. – Alain

+0

@Alain có vẻ như băm 'mặc định' được thiết kế để đặt mặc định cho các tham số tuyến đường. Chẳng hạn như ': id' hoặc': format'.Xem cập nhật của tôi –

+0

, chúng tôi có 3 tuyến: nguồn cấp dữ liệu, phổ biến và chỉ mục sử dụng cùng mã chính xác (mã từ chỉ mục), chúng tôi chỉ cần thực hiện một số thiết lập trước khi thực hiện hành động chỉ mục trong bộ lọc trước thông số: biến thể. Điều này cho phép chúng tôi sử dụng lại hành động chỉ mục mà không cần phải viết bất kỳ mã bổ sung nào trong bộ điều khiển. Giống như chúng ta sẽ phải làm gì nếu chúng ta tạo ra mỗi tuyến đường và thêm mã vào mỗi hành động điều khiển để hiển thị trang chỉ mục. Nếu bạn đang nói với tôi không có cách nào để làm cho tuyến đường này làm việc, tôi sẽ chờ một vài ngày (hy vọng bạn là sai! ;-)) sau đó cung cấp cho bạn tiền thưởng. – Alain

0

Ý tưởng tôi phải đặt biến thể mặc định có thể là cho phép đường dẫn động. Thay vì đặt variant làm chuỗi truy vấn, hãy sử dụng nó như một phần của đường dẫn thực tế. Phương pháp này sẽ không yêu cầu bộ lọc trước trong bộ điều khiển của bạn.

namespace :api do 
    namespace :v1 do 
    root :to => 'items#index', :defaults => { :variant => 'feed' } 
    get ':variant' => 'items#index', :defaults => { :variant => 'feed' } 
    end 
end 

Sau đó, bạn có thể truy cập vào các khu vực khác nhau trên trang web với

GET "http://localhost:3000/api/v1" # params[:variant] == 'feed' 
GET "http://localhost:3000/api/v1/feed" # params[:variant] == 'feed' 
GET "http://localhost:3000/api/v1/popular" # params[:variant] == 'popular' 
Các vấn đề liên quan