2012-08-22 7 views
5

mam tę drogę:Brak odpowiednika trasa w specyfikacji kontrolera dla mojej skomplikowanej trasie

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

który jest zagnieżdżony w API i v1 nazw. (Parametry request_source pochodzą z przestrzeni nazw Api).

Chcę przetestować działanie indeksu w mojej specyfikacji kontrolera. Próbowałem:

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

nie działa, i tak robi:

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

mówiąc:

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

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

powodem chcę użyć wariantu wysłać params do sterownika jest bo mam wszystkie te trasy:

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

Następnie w ItemsController, mam przed Filter "get_items" dla akcji index wich robi:

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

Jaka jest backtrace na wyjątku? –

Odpowiedz

2

Wygląda jak problem pochodzi od zdefiniowania defaults: { variant: :feed }. Czy możesz proszę wyjaśnić, co próbujesz osiągnąć z tym.

I stworzył aplikację, aby sprawdzić, co masz i następujące w config/routes.rb

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

mam to kiedy wpadłem rake routes.

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

Aktualizacja: ustawienie domyślne dla params zmiennej dla czegoś, co nie jest zdefiniowana w trasie można wykorzystać w swoim działaniu.

params[:variant] ||= 'feed' 

Aktualizacja 2: można warunkowo przypisać params[:variant] w sposób tak jak przed filtrem.

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

Mamy wiele tras przechodzących do item # index. default: {variant:: xxx} służy do ustawiania parametrów, które określają zachowanie akcji indeksowania na podstawie żądanej trasy. – Alain

+0

@Alain wygląda na to, że hash 'defaults' ma na celu ustawienie domyślnych parametrów trasy. Takie jak ': id' lub': format'.Zobacz moją aktualizację –

+0

chodzi o to, że mamy 3 trasy: feed, popularną i index, z których wszystkie używają tego samego kodu (tego z indeksu), musimy po prostu zrobić kilka ustawień przed wykonaniem akcji index w przedfilmowym filtrze, który patrzy na the: variant param. Dzięki temu możemy ponownie wykorzystać akcję indeksowania bez konieczności pisania dodatkowego kodu w kontrolerze. Tak jak byśmy musieli zrobić, gdybyśmy utworzyli każdą trasę i dodali kod w każdej akcji kontrolera, aby wyświetlić stronę indeksu. Jeśli mówisz mi, że nie ma sposobu, aby ta trasa działała, poczekam kilka dni (mając nadzieję, że się mylisz ;-)), a następnie daj nagrodę. – Alain

0

Ideą, dla której musiałem ustawić domyślny wariant, było umożliwienie dynamicznej ścieżki. Zamiast ustawiania variant jako ciągu zapytania, użyj go jako części samej ścieżki. Ta metoda nie wymaga wcześniejszego filtra w kontrolerze.

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

Następnie można uzyskać dostęp do różnych obszarów na stronie z

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' 
Powiązane problemy