2014-11-04 66 views
0

這裏可能是一個新手問題。我試圖通過Passenger和Apache部署一個Sinatra應用程序。當部署在VirtualHost根目錄時,該應用程序完美工作,但在嘗試將其部署到子URI時,無法正確處理表單帖子。如何處理部署到子URI的Sinatra應用程序中的表單?

A中的應用程序的非常簡化的版本如下:

測試app.rb:

require 'sinatra/base' 
require 'haml' 

class TestApp < Sinatra::Base 

    get '/' do 
    haml :ask 
    end 

    post '/submit' do 
    if params[:test_string].nil? || params[:test_string].empty? 
     redirect '/' 
    end 

    @test_string = params[:test_string] 
    haml :result 
    end 
end 

layout.haml:

!!! 
%html 
    %head 
    %title Test App 
    %body 
    = yield 

ask.haml:

%form{:action => '/submit', :method => 'post'} 
    %legend 
    Get a string 
    %p 
    %label{:for => ''} Please enter a string: 
    %input{:type => 'textbox', :name => 'test_string', :id => 'test_string'} 
    %p 
    %input{:type => 'submit', :value => 'Submit >>>'} 

result.haml:

%p== Here's your string: #{ @test_string } 

什麼似乎正在發生的是,表單POST不會正確的URI - 它似乎忽略子URI配置,並且要到虛擬主機的根在那裏,當然,還有沒有代碼來處理路線。我已經檢查並重新檢查了Apache配置,這似乎不是問題所在。

<VirtualHost *:80> 
    ServerName my.domain.com 
    DocumentRoot /var/websites/home 
    <Directory /var/websites/home> 
    Allow from all 
    Options -MultiViews 
    </Directory> 

    Alias /test-app /var/websites/test-app/public 
    <Location /test-app> 
    PassengerBaseURI /test-app 
    PassengerAppRoot /var/websites/test-app 
    </Location> 
    <Directory /var/websites/test-app/public> 
    Allow from all 
    Options -MultiViews 
    </Directory> 
</VirtualHost> 

有什麼辦法(比硬編碼的形式等),以確保表單發送到子URI,在那裏我的應用程序可以處理的,而不是發佈到虛擬主機的根呢,?

回答

0

不知道這是處理這一目標的最佳方式,但我工作圍繞這一問題通過使用Sinatra的URL幫手ask.haml:

%form{:action => "#{ url('/submit') }", :method => 'post'} 
    %legend 
    Get a string 
    %p 
    %label{:for => ''} Please enter a string: 
    %input{:type => 'textbox', :name => 'test_string', :id => 'test_string'} 
    %p 
    %input{:type => 'submit', :value => 'Submit >>>'} 

通過這樣做,我的形式發佈到應用程序的子URI而不是VirtualHost根。

相關問題