2012-08-22 51 views
5

我有這樣的路線:在控制器的規格沒有路由匹配我的複雜路徑

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

其嵌套在API和V1命名空間。 (request_source params來自Api命名空間)。

我想測試我的控制器規範中的索引動作。我想:

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

不工作,也是如此:

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

說:

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

------- --------編輯 -

我之所以要使用該變種將參數發送給控制器,是因爲我擁有所有這些路線:

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

然後,在上述ItemsController,我有一個過濾器「get_items」爲索引操作至極做之前:

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

有什麼異常的回溯訪問該網站上不同的地方? –

回答

2

它看起來像這個問題是從定義defaults: { variant: :feed }到來。你能否詳細說明你正在試圖完成的事情。

我創建了一個應用程序來測試你有什麼,並與config/routes.rb

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

下面我得到這個,當我跑rake routes

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

更新:設置爲東西params變量是不是在你可以在你的動作使用路線定義了默認。

params[:variant] ||= 'feed' 

更新2:可以有條件地在過濾器之前分配params[:variant]像這樣。

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

我們有很多路線去物品#索引。默認值:{variant::xxx}用於設置一個參數,該參數將根據請求的路線確定索引操作的行爲。 – Alain

+0

@Alain它看起來像'defaults'哈希被設計爲設置路由參數的默認值。如':id'或':format'。看到我的更新 –

+0

事情是,我們有3條路線:飼料,流行和索引都使用完全相同的代碼(索引之一),我們只需要做一些設置,然後執行前過濾器中的索引操作, :變體參數。這允許我們重新使用索引操作,而無需在控制器中編寫任何其他代碼。就像我們在創建每個路由並在每個控制器操作中添加代碼以呈現索引頁時必須執行的操作一樣。如果你告訴我沒有辦法讓這條路線工作,我會等幾天(希望你錯了!;-))然後給你賞金。 – Alain

0

一個想法,我不得不設置一個默認的變體可能是讓路徑是動態的。而不是將variant設置爲查詢字符串,而是將其用作實際路徑本身的一部分。此方法不需要在控制器中使用before過濾器。

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

然後,你可以用

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' 
相關問題