6 Stimmen

Routen mit optionalen Parametern in Rails

Ich versuche, eine Route zu erstellen, die wie folgt aussieht: acme.com/posts/:category/:status . Beide :category y :status sind fakultativ. Ich habe viele Varianten geschrieben, aber keine hat funktioniert:

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)

Die Idee ist, in der Lage zu sein 1) nach Kategorie filtern , 2) nach Status filtern , und 3) nach Kategorie und Status filtern, wenn beides vorhanden ist . Die aktuelle Konfiguration hat auch meine /posts/new Pfad und leitet immer weiter zu posts#index .

2voto

Moin Haidar Punkte 1614

Ich hatte diese Variante und sie scheint gut zu funktionieren:

  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 route

list_admin_posts GET    /admin/posts(/:category(/:status))(.:format)                 admin/posts#index

1voto

rthbound Punkte 1285

Sie können die eher RESTful resources :posts (in config/routes.rb) und senden Sie die Parameter in der Abfragezeichenfolge.

Bei diesem Ansatz sind alle Parameter optional und Sie sind nicht auf die Verwendung vordefinierter Parameter beschränkt.

0voto

felipeclopes Punkte 3960

Funktioniert das für Sie?

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

Hoffentlich hilft das wenigstens!

0voto

spas Punkte 1896

Sie könnten es so versuchen:

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

Damit können Sie Ihren eigenen Filterweg erstellen. Dann könnten Sie params[:category_or_status] in Ihrem Controller und rufen Sie die Kategorie oder den Status ab, wenn sie gegeben sind.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X