ruby-on-rails – 我的复杂路由的控制器规范中没有路由匹配

我有这条路线:

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

它嵌套在api和v1名称空间中. (request_source参数来自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
最佳答案
看起来问题来自于定义默认值:{variant :: feed}.能否详细说明一下你想要用它做什么.

我创建了一个应用程序,用于测试您拥有的内容以及config / routes.rb中的以下内容

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

当我跑rake路线时我得到了这个.

$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

转载注明原文:ruby-on-rails – 我的复杂路由的控制器规范中没有路由匹配 - 代码日志