Передача идентификатора в статический маршрут - соответствует page.url => "pages # show",: id => page.id - не работает - PullRequest
2 голосов
/ 14 февраля 2012

Я пытаюсь создать модель страницы с помощью activeadmin и awesome_nested_set. Я пытался выяснить, как создавать динамические маршруты с правильными конечными слагами (например, / page1 / page1subpage / a-subpage-of-page1subpage / etc). Я нашел пост кого-то другого с кодом rails2, который я превратил в мой маршрут. Rb:

Page.all.each do |page|
  page.url = "/"+page.self_and_ancestors.map{|p| p.slug}.join("/")
  page.save
  match page.url => "pages#show", :id => page.id
end

Он просто не пропускает никаких идентификаторов. Как мне заставить rails3 передать ID в маршрут ?? это просто соединение всех страниц со страницами # show без идентификатора param.

Также, если есть лучший способ сделать это в рельсах 3, дайте мне знать.

РЕДАКТИРОВАТЬ: похоже, что rails не любит передавать: id в качестве параметра .. Если я изменю его на: page_id, он будет работать ..

match page.url, :controller => 'pages', :action => 'show', :page_id => page.id

Как я могу перезагрузить маршруты или сделать это в активной записи?

Ответ (позднее редактирование): я закончил тем, что создал метод after_validation, который проверяет, был ли slug_changed? и для себя, его предков и потомков, заново создает URL для себя, сохраняет его, затем вызывает:

MyAppName::Application.reload_routes!

И я удалил метод page.save в маршрутах ..., который также вызывает некоторые проблемы при выполнении таких действий, как rake db: migrate на новых БД.

1 Ответ

3 голосов
/ 15 февраля 2012

Метод match должен распознавать :id:

Любые параметры, не отображаемые здесь, передаются как параметры с URL-адресом.

Я не знаю, почему к :id и :page_id относятся по-разному.Вы можете использовать :defaults для установки значений по умолчанию в params, хотя:

Вы также можете определить другие значения по умолчанию в маршруте, указав хэш для опции :defaults,Это относится даже к параметрам, которые вы не указали в качестве динамических сегментов.

Так попробуйте это:

Page.all.each do |page|
  page.url = "/" + page.self_and_ancestors.map { |p| p.slug }.join("/")
  page.save
  match page.url => "pages#show", :defaults => { :id => page.id }
end

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

Page.all.each do |page|
  match page.url => 'pages#show', :defaults => { :id => page.id }
end

в вашем routes.rb.

Обычный подход для этого будет иметь один маршрут:

get '/:slug' => 'pages#show', :constraints => { :slug => %r([\p{Alnum}_.-/]+) }

И затем используйте :slug вместо :id, чтобы найти страницу:

def show
  @page = Page.find_by_url(params[:slug])
  #...
end

Тогда вам не нужно беспокоиться о динамических маршрутах, вам просто нужночтобы убедиться, что url правильно и что они проиндексированы.Точная форма :constraints, которую вы используете, будет зависеть от того, как выглядят ваши значения url.Вы также захотите поместить этот маршрут внизу вашего routes.rb.

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