Указание всего пути в качестве дополнительного Rails 3.0.0 - PullRequest
1 голос
/ 12 июня 2010

Я хочу создать маршрут Rails 3 с совершенно необязательными параметрами. Пример прерванного маршрута:

match '(/name/:name)(/height/:height)(/weight/:weight)' => 'people#index'

Что приводит к результату 'rake: маршруты':

/ (/ имя /: название) (/ высота /: высота) (/ вес /: вес)

И, таким образом, добавляем начальный слеш ко всем ссылкам:

<a href="//name/kevin">...</a>

Маршрут работает, если я укажу его как:

match '/people(/name/:name)(/height/:height)(/weight/:weight)' => 'people#index'

Но я хочу, чтобы это было корневым URL (как в первом примере, который не работает). Спасибо.

Ответы [ 2 ]

2 голосов
/ 29 июня 2010

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

Поместите это в lib/custom_router.rb

class CustomRouter
  def initialize(app)
    @app = app
  end

  def call(env)
    if env['REQUEST_PATH'].match(/^\/(name|height|weight)/)
      %w(REQUEST_PATH PATH_INFO REQUEST_URI).each{|var| env[var] = "/people#{env[var]}" }
    end
    @app.call(env)
  end
end

и добавьте

 config.middleware.use "CustomRouter"

к вашему config/application.rb.

Затем вы можете установить маршрут как

match '/people(/name/:name)(/height/:height)(/weight/:weight)' => 'people#index'

, и он будет работать.

0 голосов
/ 26 июня 2010

Работает ли это, если вы используете отдельное корневое отображение?

root :to => 'people#index'
match '(/name/:name)(/height/:height)(/weight/:weight)' => 'people#index'

Это кажется довольно серьезным упущением в новой системе маршрутизации.

Может быть способ взломать его через промежуточное программное обеспечение стойки (возможно, переопределить Rack :: URLMap), но это немного не в моей лиге.

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