Как ограничить трассируемые маршруты динамическими параметрами, чтобы иметь только определенную комбинацию параметров - PullRequest
0 голосов
/ 09 сентября 2018

Я делаю Rails-приложение для форума и имею следующее:

routes.rb

@@category_filters=/general|off-topic|ruby-on-rails/
@@subcategory_filters = /announcements|news|member-introductions|suggestions|
                     developers|tutorials|jobs-and-projects|miscellaneous|
                     funny-stuff/

Rails.application.routes.draw do
  scope '(:locale)', locale: /en|de/ do
    ...
    scope '/:category/:subcategory', category: @@category_filters,
                                     subcategory: @@subcategory_filters do
      resources :posts
    end
  end
  ...
end

Здесь я хочу, чтобы у моих маршрутов для posts было 2 параметра в URL с именами category и subcategory

В моем приложении есть такая структура (это форум)

  • общая
    • объявления
    • предложения
    • член-введения
  • рубин-на-рельсы
    • Новости
    • Разработчики
    • учебники
  • вне темы
    • разное
    • рабочие места-и-проекты
    • смешно материал

теперь это работает нормально с routes.rb, который я представил вам выше, но я хочу еще больше ограничить маршрутизацию, чтобы посты имели только определенную комбинацию параметров в URL

Например, это должно быть в порядке:

.../general/announcements/posts/...

Но не это:

.../general/tutorials/posts...

Потому что согласно моему дизайну сайта tutorials это не подкатегория general, а ruby-on-rails

Кто-нибудь знает, как изменить файл routes.rb, чтобы он работал так, как я хочу, чтобы он работал?

Ответы [ 2 ]

0 голосов
/ 10 сентября 2018

Я сделал это с помощью джокера:

Rails.application.routes.draw do
  @category_filters    = /(?x)general\/suggestions|
                              general\/member-introduction|
                              general\/announcements|
                              off-topic\/jobs-and-projects|
                              off-topic\/miscellaneous|
                              off-topic\/funny-stuff|
                              ruby-on-rails\/news|
                              ruby-on-rails\/developers|
                              ruby-on-rails\/tutorials/
  scope '(:locale)', locale: /en|de/ do
   ...
    scope '*category', category: @category_filters do
      resources :posts, only: %i[new edit index show]
    end
    ...
end
0 голосов
/ 09 сентября 2018

Вместо использования регулярных выражений здесь вы должны просто использовать пользовательское ограничение маршрута :

class Category
  OPTIONS = {
    "general" => [
      "announcements",
      "suggestions",
      "member-introductions",
    ],
    "ruby-on-rails" => [
      "news",
      "developers",
      "tutorials",
    ],
    "off-topic" => [
      "miscellaneous",
      "jobs-and-projects",
      "funny-stuff",
    ]
  }
end

class CategoryConstraint 
  def matches?(request)
    options = Category::OPTIONS
    category = request.params[:category]
    subcategory = request.params[:subcategory]

    options[category] && options[category].include?(subcategory)  
  end
end

Rails.application.routes.draw do
  resources :posts, constraints: CategoryConstraint.new
end

Вы можете упростить это до DSL, используя только .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...