【问题标题】:Rails 3 resource route with param as prefix以参数为前缀的 Rails 3 资源路由
【发布时间】:2011-06-11 07:31:54
【问题描述】:

我的 rails 3 应用Apache/mod_proxy 服务器的后台运行。

rails 应用中存在一个强制前缀 :site_pin

在 Apache 中,我有以下内容来抽象我的前缀:

ServerName example.com

ProxyRequests Off
<Proxy *>
    Order deny,allow
    Allow from all
</Proxy>

ProxyPass / http://localhost:3000/site/example/
ProxyPassReverse / http://localhost:3000/site/example/

<Location />
    Order allow,deny
    Allow from all
</Location>

在我的 routes.rb 中,我有以下内容:

resources :products

#RESTful fix
match 'site/:site_pin/:controller/', :action => 'index', :via => [:get]
match 'site/:site_pin/:controller/new', :action => 'new', :via => [:get]
match 'site/:site_pin/:controller/', :action => 'create', :via => [:post]
match 'site/:site_pin/:controller/:id', :action => 'show', :via => [:get]
match 'site/:site_pin/:controller/:id/edit', :action => 'edit', :via => [:get]
match 'site/:site_pin/:controller/:id', :action => 'update', :via => [:put]
match 'site/:site_pin/:controller/:id', :action => 'destroy', :via => [:delete]

以这种方式一切正常,但任何人都有更好的解决方案来删除此修复并让 routes.rb 更干净?

【问题讨论】:

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


    【解决方案1】:

    scope 对此非常有效。将您在您的 routes.rb 中发布的内容替换为:

    scope 'site/:site_pin' do
      resources :products
    end
    

    现在,运行rake:routes,您应该会看到以下输出:

        products GET    /site/:site_pin/products(.:format)             {:controller=>"products", :action=>"index"}
                 POST   /site/:site_pin/products(.:format)             {:controller=>"products", :action=>"create"}
     new_product GET    /site/:site_pin/products/new(.:format)         {:controller=>"products", :action=>"new"}
    edit_product GET    /site/:site_pin/products/:id/edit(.:format)    {:controller=>"products", :action=>"edit"}
         product GET    /site/:site_pin/products/:id(.:format)         {:controller=>"products", :action=>"show"}
                 PUT    /site/:site_pin/products/:id(.:format)         {:controller=>"products", :action=>"update"}
                 DELETE /site/:site_pin/products/:id(.:format)         {:controller=>"products", :action=>"destroy"}
    

    :site_pin 将作为params[:site_pin] 使用。

    当然,您可以将其他资源和路由添加到范围块中;所有这些都将以site/:site_pin为前缀。

    【讨论】:

    • 不客气。如果我的回答解决了你的问题,欢迎采纳。这将使您将来更容易获得其他问题的答案。
    • 这非常有用。我正在使用相同的技术为我的所有 api 路由添加一个版本号。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2019-06-30
    • 2011-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多