带有两个正斜杠的URL

时间:2012-10-15 16:37:04

标签: ruby-on-rails ruby-on-rails-3

在我的Rails项目中,在我的index视图中,我有一个链接

<%= link_to 'Show all posts', show_all_path %>

routes.rb中,我有一条路线:

match "show_all" => "Posts#show_all"

当我点击该链接时,它会从

开始
http://<domain name>/my_rails_project

http://<domain name>/my_rails_project//show_all

有效。但是,有两个正斜杠看起来不太好。我可以这样做,只出现一个正斜杠吗?

编辑:这些是我的一些文件:

到config / environment.rb

require File.expand_path('../application', __FILE__) 
Blog::Application.initialize!

config / environments / development.rb

Blog::Application.configure do 
  config.cache_classes = false 
  config.whiny_nils = true 
  config.consider_all_requests_local = true 
  config.action_view.debug_rjs = true 
  config.action_controller.perform_caching = false 
  config.action_mailer.raise_delivery_errors = false 
  config.active_support.deprecation = :log 
  config.action_dispatch.best_standards_support = :builtin 
  config.action_controller.asset_host = "//pauls.scripts.asu.edu/blog/public" 
end

config / routes.rb:

Blog::Application.routes.draw 
  do resources :posts match "show_all" => "Posts#show_all" 
end

rake routes

的输出
show_all        /show_all(.:format)             {:action=>"show_all", :controller=>"Posts"}

7 个答案:

答案 0 :(得分:1)

当我使用“匹配”时,这是我使用的语法:

match "/show_all" => "Posts#show_all"

但是我不确定这个正斜杠是否会解决你的问题。试一试?

干杯

答案 1 :(得分:1)

如何将应用设置为在子uri下提供?这是最可能的问题。或许可以报告你是如何做到的。据推测,你不是在webrick下运行它,而是在dev模式的服务器上乘客?

RailsBaseURI或RAILS_RELATIVE_URL_ROOT的值是多少,具体取决于您使用的是什么,它是否有尾部斜杠?检查你的apache / passenger配置文件夹上的任何位置是否有尾随斜杠(虚拟主机中的文档根目录?)。尝试输出root_url的值以查看它是什么。

作为一个简单的本地测试,创建一个新项目并使用类似这样的路由(注意范围):

Blog :: Application.routes.draw做

scope 'my_rails_project' do
   match '/test',  :to => 'welcome#test'
end

然后在新的帖子控制器中进行测试操作:

 def test
    render :text => "ROOT-#{root_url}"
 end

通过使用更简单的路线,并指导您重做设置,可能会对出现问题的方法有所了解。

然后在您的实际项目中,您可以尝试两件事,更改用于设置子uri的ENV变量,验证虚拟主机设置,以及围绕所有路径设置范围:

scope 'my_rails_project' do
   match '/show_all'=> "posts#show_all", :as => "show_all"
end

我还会尝试检查show_all_path的输出,看看你在链接中实际得到了什么,例如你在href中得到'//',还是其他什么?

答案 2 :(得分:1)

这不是铁轨问题。 Rails不知道他自己的网址。它只知道资源的相对URL。这些亲戚网址被添加到域网址中。它不会生成非法的URL,因此不会产生错误。

所以它看起来像一个虚假的主机问题。但我无法告诉你究竟是什么问题。在某些时候,您的域名网址是www.your_domain / rails_projects /.

您可以更改虚拟主机以获取www.your_domain。

更新:

这是一个例子:

<VirtualHost 172.20.30.40>
 DocumentRoot /www/subdomain/sub2
 ServerName www.sub2.domain.tld
 ServerPath /sub2/
 </VirtualHost>

将回复:

http://www.sub2.domain.tld/sub2/

它看起来非常类似于你的问题。

答案 3 :(得分:0)

你尝试过这种语法吗?

match '/show_all'=> "posts#show_all", :as => "show_all"

:as option为您提供正确的路径

<%= link_to 'Show all posts', show_all_path %>

或许你的default_url_options会在网址的末尾添加额外的斜杠。 检查您的操作controller.default_url_options

答案 4 :(得分:0)

我注意到您的Rails应用程序位于子目录中。我不确定它是否相关,但快速搜索产生this guide可能会或可能不会解决您的问题。

答案 5 :(得分:0)

如果您想要一个像http://<domain name>/my_rails_project/show_all这样的网址,请将其添加到您的routes.rb

resources :posts
match "show_all", :to => "posts#show_all"

如果您更喜欢http://<domain name>/my_rails_project/posts/show_all这样的网址,请添加以下内容:

resources :posts do
  collection do
    get "show_all"
  end
end

您可以看到更多示例here

答案 6 :(得分:0)

尝试用空白的应用程序重现这个并在github上发布所有代码,我认为错误可能是其他的。

请告诉我们你的rails版本和ruby版本。