2011-11-10 5 views
2

몇 시간 동안 노력해 왔지만 원하는대로 내 경로를 구성 할 방법이 없습니다.sinatra의 경로 정의에 매개 변수를 사용합니다.

는 내가 달성하고자하는 것은 :

http://fooo.bar/prefix1234

내가 specifix 접두어로 시작하는 모든 것을 캡처 할.

아주 쉽게 :

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

하지만 그것은 고정 된 접두사가되고 싶지 않아. 나는 설정 파일에 접두사를 넣을

settings.rb : 세트 : 접두사, '사전'

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

이시나 위해 (정의되지 않은 메서드`접두사 '을 작동하지 않습니다 : 응용 프로그램 : 클래스 (NoMethodError)). 또한 정규식 캡처 시도 :

before do 
@prefix = settings.prefix 
end 

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

사람은 아무것도 가지고 (URL이 캡처되지 않습니다) 중 하나가 작동하지 않는 이유는 무엇입니까?

+0

만약 당신이 같은 경로를 정의 할 수 있습니다 (위에서 아래로) 레일에서와 동일한 방식으로 처리된다'/ * '아무것도 일치합니다 마지막으로. – Bohdan

+0

다른 URL과 다른 접두사를 사용하여 URL을 처리하기 때문에 원하는 해결책이 아님 – leifg

답변

2

String/Regexp가 바로 생성됩니다.이 작품 :시나 노선의

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

get "#{settings.prefix}/bar" do 
    request.path_info 
end 
+0

나는 그것을 시험해 보았습니다. 그러나 나는 전에 그것을 시도했다는 것을 확신한다 ... 이상한 – leifg

+0

오케이 죄송합니다, 문제가 무엇인지 기억합니다 :이 코드를 사용하면 모든 테스트가 제대로 실행되지만 애플리케이션을 시작할 때 다음 오류가 발생합니다. : Sinatra :: Application : Class (NoMethodError)에 대한 정의되지 않은 메소드'prefix ' – leifg

+0

Sinatra 티켓에 명시된 바와 같이, 경로를로드하기 전에 해당 설정을 * 설정해야합니다. –

3

나는 거의 수정하지 않고 당신의 예제를 얻을 수있었습니다. 이 날은 당신이 설명한 것을 할 수 : 다음 출력을 테스트하기 위해 엽총 및/test123라는 달렸다

before do 
    @prefix = "test" 
end 

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

. 출력했다 : 내보기이 제대로 작동 것을 반복 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 파일 :

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

당신은 다음이 당신의 이전 블록을 대체 할 수있다 : 다음과 같이 보일 것이다 것을 구문 분석

prefix: test 

그리고 도우미 스크립트 :

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

내 코딩 취향

은 나를 YAML 방법을 사용하여 방향으로 의지 할, 그러나 나는 이러한 솔루션 중 하나가 가능한 있어야한다고 생각합니다.

+0

제안 해 주셔서 감사합니다. 그러나 첫 번째 만 실행 가능하고 불행히도이 작업은 (완전히) 작동하지 않습니다. 예. da를 "/ test123"으로 설정하면 URL이 캡처됩니다. 그러나 "/ something123"을 얻으면 URL도 캡처됩니다. 변수 @prefix는 항상 경로에서 비어있는 것 같습니다. – leifg

관련 문제