我有这条路线:
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"}
------- EDIT ---------
我想使用变量将params发送到控制器的原因是因为我有所有这些路径:
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 :(得分: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'