использовать параметры в определении маршрутов в синатре - PullRequest
2 голосов
/ 10 ноября 2011

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

Чего я хочу добиться:

http://fooo.bar/prefix1234

Я хочу захватить все, что начинается с префикса specix.

Довольно просто:

get "/prefix:id" do
 puts params[:id]
end

Но я не хочу, чтобы это был фиксированный префикс. Я хочу поставить префикс в конфигурационном файле

settings.rb: установить: префикс, 'pre'

get "/#{settings.prefix}:id" do
 puts params[:id]
end

это не будет работать (неопределенный префикс метода для Sinatra :: Application: Class (NoMethodError)). Я также попытался захватить с помощью регулярного выражения:

before do
 @prefix = settings.prefix
end

get %r{#{@prefix}(\d+)} do |id| 
 puts "Params:  #{id}"
end

Это тоже не работает (URL не будет записан)

Кто-нибудь что-нибудь получил?

Ответы [ 2 ]

3 голосов
/ 10 ноября 2011

Я смог заставить ваш пример работать почти без изменений. Это позволило мне сделать то, что вы описали:

before do
  @prefix = "test"
end

get %r{#{@prefix}(\d+)} do |c|
  puts "#{@prefix} #{c}"
  erb :test, :locals => {:id => c}
end

Затем я запустил дробовик, чтобы проверить вывод, и вызвал / test123. Выход был:

тест 123

Мое мнение также подтвердило, что это работает правильно. Если проблема заключается в том, что URL-адрес не фиксируется, вам может потребоваться реорганизовать свою структуру так, чтобы она выглядела следующим образом:

before do
  @prefix = "test"
end

get "/#{@prefix}/:id" do
  puts "#{@prefix} #{params[:id]}"
  erb :test, :locals => {:id => params[:id]}
end

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

В качестве альтернативы, возможно, файл YAML для хранения ваших настроек и последующего анализа сценарием даст вам лучшие результаты для маршрута. Например, файл YAML с таким содержимым:

prefix: test

А затем вспомогательный скрипт, который анализирует это, и будет выглядеть примерно так:

helpers do
  def config
    @config = YAML.load_file("config.yml")
  end
end

Затем вы можете заменить свой блок до этого на:

before do
  @prefix = config["prefix"]
end

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

2 голосов
/ 11 ноября 2011

Строка / регулярное выражение генерируется сразу. Это работает:

require 'sinatra'
set :prefix, '/foo'

get "#{settings.prefix}/bar" do
  request.path_info
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...