Маршрутизация в Rails - PullRequest
0 голосов
/ 21 марта 2009

Я создаю минималистичный вики в RoR. В основном у проекта много страниц. Мой файл маршрутизации выглядит так:

map.root :controller => "projects"
map.resources :projects, :has_many => :pages
map.connect ':id', :controller => 'projects', :action => 'show'
map.connect ':project_id/:id', :controller => 'pages', :action => 'show'
map.connect ':controller/:action/:id'
map.connect ':controller/:action/:id.:format'

Это позволяет мне, например, получить доступ к «главной» странице проекта «обучение»:

http://localhost:3000/teaching/main

Однако, как только я нажимаю на ссылку, она преобразуется в следующее:

http://localhost:3000/projects/teaching/pages/main

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

Ответы [ 2 ]

1 голос
/ 21 марта 2009

Я бы бросил работу с map.connect - это не очень RESTful и может очень запутать вас.

На первый взгляд я подумал, что вы можете использовать директивы: member и: collection, чтобы добавить то, что вы хотели, но когда я присмотрелся, я понял, что это не поможет.

У меня небольшие трудности с пониманием вашей модели данных - страница может иметь много страниц? Или учит название проекта, а затем у него есть страницы?

Если это так, то вам, вероятно, нужно взглянуть на плагин, такой как SubDomainFu, и использовать субдомены, основанные на именах проектов, а не взламывать файл маршрутов напрямую. Мы успешно использовали это, чтобы дать схему, которую вы описываете (домен подразумевает проект, требуется немного дополнительного кода), а также такие вещи, как teach.yourdomain.com и learning.yourdomain.com (что может быть весело, если вы хотите использовать SSL, но это другая история).

0 голосов
/ 21 марта 2009

Rails - это соглашение о конфигурации. Вы должны согласиться с соглашениями, если хотите удобство, которое приносит Rails. Я настоятельно рекомендую придерживаться модели RESTful и принять то, что сейчас делает rails.

С учетом сказанного вы, вероятно, можете взломать что-нибудь вместе. Это не будет красиво, и будет больно каждый раз, когда вы захотите создать ссылку.

Так что сначала избавьтесь от

 map.resources :projects, :has_many => :pages
 map.connect ':controller/:action/:id'
 map.connect ':controller/:action/:id.:format'

потому что map.resources - это то, что отправляет вас на URL, который вам не нужен, и два map.connect тоже вам не помогают. Так что теперь вы должны просто иметь

 map.connect ':project_id/:id', :controller => 'pages', :action => 'show'
 map.connect ':id', :controller => 'projects', :action => 'show'

Тогда, когда вы захотите создать ссылку, вам придется сделать это самостоятельно. Вы хотите использовать что-то вроде этого:

 <%= link_to 'Blah', :project_id => @project, :id => @project.pages.first %>

или что-то в этом роде. Я не знаю точно, как именно вы собираетесь указать маршрут, вам, вероятно, придется изменить символы: project_id и: id.

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

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