создавать динамические маршруты из контента - PullRequest
0 голосов
/ 15 декабря 2009

Я пытаюсь настроить динамические маршруты в моем приложении rails.

т.е.

У меня есть модель актов с атрибутом имени.

. Имя: строка

То, что я пытаюсь сделать, это использовать это имя в качестве моего URL.

в моем маршруте, если есть

 map.connect 'blacktie/:id', :controller => 'acts', :action => 'show', :id => 3

Это приводит меня к http://0.0.0.0:3000/blacktie

Я знаю, что могу сделать что-то вроде

def map.controller_actions(controller, actions)
actions.each do |action|
  self.send("#{controller}_#{action}", "#{controller}/#{action}", :controller => controller, :action => action)
end

Просто не уверен, возможно ли это вообще.

1 Ответ

1 голос
/ 15 декабря 2009

Добавьте следующее к нижней части вашего config/routes.rb

map.connect '*url', :controller => 'acts', :action => 'show_page'

Затем определите следующее в app/controllers/acts_controller.rb

def show_page
  url = params[:url]
  if Array === url
    url = url.join('/')
  else
    url = url.to_s
  end

  # you now have the path in url
  @act = Acts.find_by_name(url)

  if @act
    render :action => :show
  else
    redirect_to some_error_page, :status => 404
  end
end

Несколько ошибок с вышеуказанным подходом.

  1. Маршрут поймать всех. Вы будете ловить все, что не соответствует маршруту над ним. Поэтому убедитесь, что он последний, и убедитесь, что вы готовы справиться с 404-ми и тому подобным.
  2. Параметр :url - это массив или строка в зависимости от входящего маршрута. Например, /blacktie/night будет массивом со значением ['blacktie', 'night']. Вот почему я присоединился к ним в начале show_page. Таким образом, ваша find_by_name функция может быть действительно умной и учитывать вложенные действия и тому подобное.

Надеюсь, это поможет.

OR ...

Добавьте это к маршрутам (внизу):

map.connect ':name', :controller => "acts", :action => "show_page", 
            :requirements => {:name => /[\w|-]*/}

Это говорит рельсам отправлять что-либо, соответствующее требованиям вашему обработчику. Таким образом, ваша show_page будет выглядеть следующим образом:

def show_page
  @act = Acts.find_by_name(params[:name])

  if @act
    render :action => :show
  else
    redirect_to some_error_page, :status => 404
  end
end

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

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