这可能是一个新手问题。我正在尝试通过Passenger和Apache部署Sinatra应用程序。当部署在VirtualHost根目录时,该应用程序可以正常工作,但在我尝试将其部署到子URI时无法正确处理表单帖子。
该应用程序的一个非常简化的版本如下:
测试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配置,并且转到VirtualHost根目录,当然,没有代码可以处理路线。我检查并重新检查了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,而不是发布到VirtualHost根目录?
答案 0 :(得分:1)
不确定这是处理此问题的最佳方法,但我通过在ask.haml中使用Sinatra的url帮助程序解决了这个问题:
%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根目录。