我怎么能破解url helper / route helper来使所有路径都添加前缀

时间:2015-10-26 11:07:05

标签: ruby-on-rails

我想让所有生成的网址都以/sample_1/为前缀。

因为服务器在子文件夹下运行,

我怎么能在Rails 4.2.4上做?以下路由规则不会生成带前缀的所有路径。

我无法通过Google找到任何可行的解决方案

的routes.rb

Rails.application.routes.draw do

  sample_1 = Proc.new do
      root 'welcome#category'
  end

  if ENV['RAILS_RELATIVE_URL_ROOT']
    scope ENV['RAILS_RELATIVE_URL_ROOT'] do
      sample_1.call
    end
  else
    sample_1.call
  end

end

application.rb中

module Sample
  class Application < Rails::Application

    config.active_record.raise_in_transactional_callbacks = true
    config.middleware.use Rack::Deflater
    config.relative_url_root = ENV['RAILS_RELATIVE_URL_ROOT']
  end
end

nginx,根URL运行flask web server而不是rails

    location /sample_1/ {
        rewrite ^/sample_1/(.*)$ /$1 break;
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
        proxy_set_header   Host $http_host;
        proxy_pass http://127.0.0.1:8512;
    }

    location / {
            proxy_pass http://localhost:8006;

            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header Host $host;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

3 个答案:

答案 0 :(得分:0)

您是否尝试使用:asscope

进行前缀
scope "admin", :as => "admin" do
  resources :photos, :accounts
end

resources :photos, :accounts

这将生成admin_photos_pathadmin_accounts_path等路线,分别映射到/ admin / photos和/admin/accounts

:as使用指定的标签前缀此范围内的路由助手。

  scope :as => "sekret" do
    resources :posts
  end

答案 1 :(得分:0)

由于内置Rails relative_url_root选项does not seem to work,您可以使用解决方法:

Rails.application.routes.draw do
  # Bad hack because relative_url_root does not work.
  # @fixme, @todo
  scope ENV['MYAPP_RELATIVE_URL_ROOT'] do
   root 'welcome#category'
  end
end

调用scope nil实际上对结果路由没有任何作用,所以你可以简化一下。

$ rake routes MYAPP_RELATIVE_URL_ROOT=foo
Prefix Verb URI Pattern    Controller#Action
  root GET  /foo(.:format) welcome#category

我不会在解决方法中使用RAILS_RELATIVE_URL_ROOT,因为如果在将来的Rails版本中修复了该行为,您的应用会意外中断。因此,一种安全的方法是让RAILS_RELATIVE_URL_ROOT取消设置,直到您知道它已修复然后删除黑客为止。

编辑。

确实有效。你最有可能做错其他事。

screenshot

  1. git clone https://github.com/maxcal/sandbox/tree/33344204
  2. cd sandbox
  3. bundle install
  4. MYAPP_RELATIVE_URL_ROOT=test rails s
  5. 在浏览器中打开localhost:3000/test
  6. 你实际设置ENV vars的方式取决于你的shell。以上适用于Bash / Zsh。我猜这就是你失败的地方。

答案 2 :(得分:0)

Rails文档say you can use a scope

#config/routes.rb
def method
   root "....."
   resources :controller_1, :controller_2
end

if .......
   scope :prefix_1 do
      method
   end
else
   method
end
  

因为服务器正在子文件夹下运行

这应该成为Rails的问题。

如果您希望将应用程序放在子文件夹中,则可以使用 Web服务器软件对其进行路由。

以下是nginx的示例:

server {
   listen 80;
   server_name your_folder.com;
   root /your/app/destination/folder;

这意味着如果您坚持使用_path助手(而不是_url),它将使所有相对路径保持正常运行。