Вопрос по ruby-on-rails-4, ruby-on-rails, routes, ruby-on-rails-3.2, ruby-on-rails-3 – Как создать универсальный маршрут в Ruby on Rails?

10

Я хочу, чтобы все запросы, удовлетворяющие определенному ограничению, шли к конкретному контроллеру. Поэтому мне нужен универсальный маршрут. Как мне указать это в Rails? Это как то так?

match '*', to: 'subdomain_controller#show', constraints: {subdomain: /.+\.users/}

Это действительно поймает все возможные маршруты? Это'Важно, чтобы ни один из них не проскальзывал, даже если вложенных каталогов много.

Используя Ruby on Rails 3.2, но готов к обновлению до 4.0.

ОБНОВИТЬ:'*path' похоже на работу. Тем не менее, проблема, которую ям работает в это всякий раз, когда файл существует в моемpublic каталог, Rails отображает это вместо.

@ksu - так это*path? А потомparams[:path] держит путь? at.
Я думаю, что на этот вопрос ответ здесь: [stackoverflow.com/questions/4132039/...        [1]:stackoverflow.com/questions/4132039/... ksu

Ваш Ответ

2   ответа
18

что вам нужны незначительные изменения в этом подходе, но вы понимаете:

ОБНОВИТЬ:

#RAILS 3
#make this your last route.
match '*unmatched_route', :to => 'application#raise_not_found!'

#RAILS 4, needs a different syntax in the routes.rb. It does not accept Match anymore.
#make this your last route.
get '*unmatched_route', :to => 'application#raise_not_found!'

А также

class ApplicationController < ActionController::Base

...
#called by last route matching unmatched routes.  
#Raises RoutingError which will be rescued from in the same way as other exceptions.
def raise_not_found!
    raise ActionController::RoutingError.new("No route matches #{params[:unmatched_route]}")
end
...

end

Больше информации здесь:https://gist.github.com/Sujimichi/2349565

Да, я думаю, Rails 4 нужен другой синтаксис в routs.rb. Это не принимает матч больше. получить '* Unmatched_route»,: to => 'Приложение # raise_not_found! TheAshwaniK
Это неработать для корневых путей или путей, которые существуют вpublic каталог. Корневые пути не имеют большого значения, я могу добавитьroot to в моем файле маршрутов. Но другой вопрос, который я нене знаю, как преодолеть. at.
В Rails 4 это выдает ошибку: грабли прерваны! Вы не должны использоватьmatch метод в вашем роутере без указания метода HTTP. Если вы хотите выставить свое действие как GET, так и POST, добавьтеvia: [:get, :post] вариант. Если вы хотите выставить свое действие на GET, используйтеget в роутере: вместо: совпадатьконтроллер # действие» Получить "контроллер # действие» Pavel Kalashnikov
Rails 4 принимает совпадения, но вам также нужно указать метод HTTP. Поймать все, что перенаправляет в rootmatch "*path", to: redirect('/'), via: :all Epigene
0

Это должно работать

Calamas::Application.routes.draw do
  get '*path', to: 'subdomain_controller#show',constraints: lambda { |request| request.path =~ /.+\.users/ }
end
Мой предыдущий ответ нет работал в вашем случае. Смотрите мой обновленный ответ. Документация здесь -> guides.rubyonrails.org/routing.html#advanced-constraints usha
Haven»Я пытался это сделать, но, похоже, это может сбивать с толку:subdomain как путь? Является ли ограничение на путь или поддомен тогда? at.
Это неработать для корневых путей или путей, которые существуют вpublic каталог. Корневые пути не имеют большого значения, я могу добавить их в свой файл маршрутов. Но другой вопрос, который я нене знаю, как преодолеть. at.

Похожие вопросы