Rails 3 маршрутизация - PullRequest
       2

Rails 3 маршрутизация

2 голосов
/ 04 ноября 2010

Хорошо, я относительно новичок в rails и работаю над книгой Rails для PHP-программистов.Чтобы было интересно, я использую Rails 3 и haml для работы с книгой, а книга написана с использованием Rails 2.X и erb, поэтому некоторые примеры устарели.

К вопросу: маршрутПримером в книге является

map.presentation 'meetings/:meeting_id/presentations/:action/:id',
    :controller => "presentations",
    :action => "show",
    :meeting_id => /\d+/

Так что это был маршрут до Rails 3.Моя адаптация вышеупомянутого в маршрут Rails 3:

match 'meetings/:meeting_id/presentations/:action/:id', :to => 'presentations#show', :constraints => {:id => /\d/}

Моя адаптация работает для действия уничтожения, но не для действия редактирования ... и из-за моей неопытности я не знаю, что яя делаю неправильноИз статьи здесь (http://www.engineyard.com/blog/2010/the-lowdown-on-routes-in-rails-3/) похоже, что я все делаю правильно, но что-то не так.

link_to Помощники, которые создают URL-адреса, выглядят следующим образом

= link_to 'edit',   :controller => 'presentations',
                    :action     => 'edit',
                     :meeting_id => presentation.meeting.id,
                     :id            => presentation.id
# Incorrectly Produces: http://localhost:3000/presentations/edit?meeting_id=2&id=1

= link_to 'destroy', {  :controller => 'presentations',
                        :action     => 'destroy',
                        :meeting_id => presentation.meeting.id,
                        :id         => presentation.id },
                    :confirm => 'Are you sure?',
                    :method => :delete
# Correctly Produces: http://localhost:3000/meetings/2/presentations/destroy/1

Ваша помощь поможет мне избавиться от проблем с маршрутизацией. Большое спасибо!

РЕДАКТИРОВАТЬ

Вот файл нерабочего маршрута.в целом:

UserGroup::Application.routes.draw do
  get "presentations/new"
  get "presentations/edit"
  get "sessions/new"
  get "users/index"
  get "users/show"
  get "users/new"
  get "users/edit"
  get "meetings/index"

  match '/meetings/show/:id', :to => 'meetings#show', :as => 'meeting'
  match '/meetings/new', :to => 'meetings#new', :as => 'new_meeting'
  match '/meetings/edit/:id', :to => 'meetings#edit', :as => 'edit_meeting'

  match 'meetings/:meeting_id/presentations/:action/:id', :to => 'presentations', :constraints => {:id => /\d/}

  #default route
  match ':controller(/:action(/:id(.:format)))'
end

РЕДАКТИРОВАТЬ 2

Благодаря codykrieger я взглянул на остальную часть файла маршрутов (я знаю, да, верно?). Видимо,все эти маршруты "..." добавляются при использовании генератора rails и помогают установить некоторые соединения по умолчанию в приложении. Я закомментировал строку get "presentations/edit" и, удивительно, моя адаптация к маршрутизации действительно работает.

Это работает:

UserGroup::Application.routes.draw do
  get "presentations/new"
  #get "presentations/edit"
  get "sessions/new"
  get "users/index"
  get "users/show"
  get "users/new"
  get "users/edit"
  get "meetings/index"

  match '/meetings/show/:id', :to => 'meetings#show', :as => 'meeting'
  match '/meetings/new', :to => 'meetings#new', :as => 'new_meeting'
  match '/meetings/edit/:id', :to => 'meetings#edit', :as => 'edit_meeting'

  match 'meetings/:meeting_id/presentations/:action/:id', :to => 'presentations', :constraints => {:id => /\d/}

  #default route
  match ':controller(/:action(/:id(.:format)))'
end

Я поигрался с порядком маршрутов в файле и также обнаружил, что если я поставлю свой маршрут над всеми автоматически сгенерированными маршрутами, не комментируя get "presentations/edit", мой маршрут все еще имеет ожидаемый эффект.

ЭтоТакже работает:

UserGroup::Application.routes.draw do

  match 'meetings/:meeting_id/presentations/:action/:id', :to => 'presentations', :constraints => {:id => /\d/}

  get "presentations/new"
  get "presentations/edit"
  get "sessions/new"
  get "users/index"
  get "users/show"
  get "users/new"
  get "users/edit"
  get "meetings/index"

  match '/meetings/show/:id', :to => 'meetings#show', :as => 'meeting'
  match '/meetings/new', :to => 'meetings#new', :as => 'new_meeting'
  match '/meetings/edit/:id', :to => 'meetings#edit', :as => 'edit_meeting'


  #default route
  match ':controller(/:action(/:id(.:format)))'
end

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

Спасибо всем:)

1 Ответ

1 голос
/ 07 ноября 2010

Маршрутизация выполняется на основе первого совпадения (сверху вниз) в файле rout.rb. Таким образом, вы можете сохранить все маршруты, как вы делали выше, если хотите, и Rails будет использовать первый, который соответствует. Тем не менее, это грязный, потенциально глючный и совершенно ненужный. Поэтому в вашем коде должно быть достаточно строк «match ...», и вы можете удалить строки «get ...».

Кроме того, в вашей строке "match ... presentation ...." есть ошибка, она должна быть

...{:id => /\d+/}

иначе он будет проверять только идентификаторы длиной в 1 цифру.

Наконец, что касается вашего общего маршрута. Rb, вам не нужно делать

link_to 'edit',: controller => 'presentation', : action => 'edit', : meeting_id => presentation.meeting.id, : id => presentation.id

Вместо этого вы должны использовать edit_meeting_path, new_meeting_path и т. Д. Например,

<%= link_to "New meeting", new_meeting_path %>
<%= link_to "Edit meeting", edit_meeting_path(@meeting) %>

Наконец, вы должны прочитать Маршрутизация рельсов извне для получения рекомендаций по проектированию вложенных маршрутов и т. Д.

...