5

我正在尝试设置如下所示的路线acme.com/posts/:category/:status:两者都是可选的:category:status我写了很多变体,但没有一个奏效:

resources :posts do
  match '(/:category)(/:status)', to: 'posts#index', as: 'filter', on: :collection
end

# Category Links
link_to "Questions", filter_posts_path(:questions)
link_to "Suggestions", filter_posts_path(:suggestions)

# Status Links
link_to "Published", filter_posts_path(params[:category], :published)
link_to "Draft", filter_posts_path(params[:category], :draft)

这个想法是能够1) 按类别过滤2) 按状态过滤以及 3) 如果两者都可用,则按类别和状态过滤。当前的设置也破坏了我的/posts/new路径,总是重定向到posts#index.

4

4 回答 4

2

我有这个变化,它似乎工作正常:

  namespace :admin do
    resources :posts, :except => [:show] do
      collection do
        get "/(:category(/:status))", to: "posts#index", as: "list", :constraints => lambda{|req|
          req.env["PATH_INFO"].to_s !~ /new|\d/i
        }
      end
    end
  end

= CONTROLLER=admin/posts rake 路由

list_admin_posts GET    /admin/posts(/:category(/:status))(.:format)                 admin/posts#index
于 2013-06-25T07:47:52.983 回答
1

您可以使用更多 RESTful resources :posts(在 config/routes.rb 中)并在查询字符串中发送参数。

使用这种方法,所有参数都是可选的,并且您不限于使用预定义的参数。

于 2012-10-25T19:51:05.537 回答
0

你可以尝试这样的事情:

match '/filter/*category_or_status' => 'posts#index', as: 'filter'

有了这个,您可以构建自己的过滤器路径。然后,您可以在控制器中解析params[:category_or_status]并获取类别或状态(如果已给出)。

于 2012-10-26T11:01:59.663 回答
0

这对你有用吗?

resources :posts do
  collection do
    match '/:category(/:status)', to: 'posts#index', as: 'filter'
    match '/:status', to: 'posts#index', as: 'filter'
  end
end

希望至少它有所帮助!

于 2012-10-25T19:57:55.403 回答