5

私はこのルートを持っています:

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

これは、api および v1 名前空間にネストされています。(request_source パラメータは Api 名前空間から取得されます)。

コントローラーの仕様で index アクションをテストしたいと考えています。私は試した:

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
4

2 に答える 2

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] before フィルターで条件付きで割り当てることができます。

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
于 2012-08-28T13:21:45.827 に答える
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'
于 2012-09-04T13:50:46.783 に答える