sergebezborodov
@sergebezborodov

Custom routes в Sinatra (Padrino)?

Приветствую!


Активно осваиваю ruby фрейморк — sinatra вместе с padrino. Стоит задача организовать урлогенерацию, которая часто применяется на контентых сайтах:
site.ru/category/article-slug.html


в yii подобное решается с помощью собственных правил роутинга www.yiiframework.ru/doc/guide/ru/topics.url

есть ли похожая возможность для sinatra?


я понимаю что можно сделать передачей двух параметров в url_for article и category, но хотелось бы чтобы передавал только id статьи, а правило само делало выборку из базы и формировало урл.
  • Вопрос задан
  • 2815 просмотров
Пригласить эксперта
Ответы на вопрос 2
AMar4enko
@AMar4enko
Вам просто хелпер для вьюх нужно написать, что-то типа article_url_for.
В Sinatra это можно сделать как-то так:
helpers do
  def article_url_for(id)
    # тут уже напишете выборку объекта из базы или кэша и формирование url
  end
end


В Sinatra нет генератора url, потому что там контроллеры как таковые отсутствуют. Т.е. если у вас в Yii есть роуты вида
'/<categoryName:\\w+>/<articleSlug:\\w+>' => "articles/read" 
'/<id:\\d+>' => "articles/read"


то вы можете написать экшн в виде
function actionRead(id = null, categoryName = null, articleSlug = null){
    if(!empty(id))
           article = Article::model()->findByPk(id)
    else
           article = Article::model()->findByAttributes(..)
}

И генерировать урлы:
$this->createUrl('articles/read', array('categoryName' => 'Books', 'slug' => 'Another-great-book')) //сгенерирует url первого вида 
$this->createUrl('articles/read', array('id' => 123)) //сгенерирует url второго вида


Для того, чтобы генерировать url первого вида, передавая id объекта, вам в Yii все равно придется писать хелпер, который вытащит объект из базы и сгенерирует url стандартным способом, передав туда соотв. параметры.
Ответ написан
Комментировать
AMar4enko
@AMar4enko
Все, увидел — вы про наследование «CBaseUrlRule».
Нет, в Sinatra такого нет.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы