Рельсы используют!(восклицательный знак) в маршрутах - PullRequest
2 голосов
/ 08 января 2012

В моем приложении я хотел бы создать статические страницы с пространством имен под "!"(восклицательный знак).Например:

/!/about
/!/faq

В настоящее время он работает с использованием префикса pages в моем файле routes.rb:

# config/routes.rb
get 'pages(/:action)' => 'pages', :as => :page

Это прекрасно работает и генерирует правильные URL,и т.д. Однако, если я заменим pages на !, маршруты потерпят неудачу:

# config/routes.rb
get '!(/:action)'...

Вот вывод rake routes:

pages GET     /!(.:format)             {:controller=>"pages", :action=>"index"}
page GET      /!/:action(.:format)     {:controller=>"pages"}

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

No route matches {:controller => "pages", :action => "about"}

Как ни странно, если я использую любой другой символ (например, @), маршруты работают должным образом,Почему я не могу использовать ! восклицательный знак в моих маршрутах :(. Если я отправляю сообщение о проблеме на github?

PS, это также не дает результатов, если я указываю маршрут вручную {:controller => :pages, :action => :about} с той же ошибкой.

PSS маршруты действительно работают, если при прямом посещении (/!/about) отображается правильная страница. Помощники по URL просто не позволят ему создать ссылку: (

1 Ответ

5 голосов
/ 09 января 2012

Взято из RFC3986 Унифицированный идентификатор ресурса: общий синтаксис

2.2 Reserved Characters

  reserved    = gen-delims / sub-delims

  gen-delims  = ":" / "/" / "?" / "#" / "[" / "]" / "@"

  sub-delims  = "!" / "$" / "&" / "'" / "(" / ")"
              / "*" / "+" / "," / ";" / "="

Таким образом, вы не должны включать ! в свои пути.

Возможно, вы видели синтаксис Google #!, который позволяет поисковым системам сканировать веб-приложения ajax.

например. https://twitter.com/#!/exampleUser

Но в данном случае это трюк;

Путь просто "/", а остальное рассматривается как "якорь" или "хеш"

host = "twitter.com"
path = "/"
hash = "#!/exampleUser"
...