【问题标题】:Aliasing a namespaced route in Rails在 Rails 中为命名空间路由命名
【发布时间】:2011-02-16 00:47:24
【问题描述】:

给定以下 routes.rb 文件:

# Add Admin section routes
 map.namespace :admin do |admin|
   admin.resources :admin_users
   admin.resources :admin_user_sessions, :as => :sessions
   admin.resources :dashboard

   # Authentication Elements
   admin.login '/login',  :controller => 'admin_user_sessions', :action => 'new'    
   admin.logout '/logout', :controller => 'admin_user_sessions', :action => 'destroy'

   # Default is login page for admin_users
   admin.root :controller => 'admin_user_sessions', :action => 'new'
end

是否可以将“admin”部分别名为其他内容,而不必更改应用程序中的每个重定向和 link_to?主要原因是我希望它可以在运行中进行配置,并希望它也不容易被猜到。

【问题讨论】:

    标签: ruby-on-rails ruby routing namespaces


    【解决方案1】:

    map.namespace 方法只是为其块内的路由设置一些常用选项。它使用with_options 方法:

    # File actionpack/lib/action_controller/routing/route_set.rb, line 47
            def namespace(name, options = {}, &block)
              if options[:namespace]
                with_options({:path_prefix => "#{options.delete(:path_prefix)}/#{name}", :name_prefix => "#{options.delete(:name_prefix)}#{name}_", :namespace => "#{options.delete(:namespace)}#{name}/" }.merge(options), &block)
              else
                with_options({:path_prefix => name, :name_prefix => "#{name}_", :namespace => "#{name}/" }.merge(options), &block)
              end
            end
    

    所以可以直接使用with_options方法代替namespace

    map.with_options(:path_prefix => "yournewprefix", :name_prefix => "admin_", :namespace => "admin/" ) do |admin|  
      admin.resources :admin_users
      # ....
    end
    

    你可以像以前一样继续使用路由,但前缀将是“yournewprefix”而不是“admin”

    admin_admin_users_path #=> /yournewprefix/admin_users
    

    【讨论】:

      【解决方案2】:

      为了创建命名空间的别名(例如,从另一个路由器地址调用api_version),您可以执行以下操作:

      #routes.rb
      %w(v1 v2).each do |api_version|
        namespace api_version, api_version: api_version, module: :v1 do
          resources :some_resource
          #...
        end
      end
      

      这将导致路由/v1/some_resource/v2/some_resource 到达同一个控制器。那么您可以使用params[:api_version] 来获取您需要的版本并做出相应的响应。

      【讨论】:

        【解决方案3】:

        就像在任何其他资源中一样, :path 对我来说似乎工作正常。

        namespace :admin, :path => "myspace" do
          resources : notice 
            resources :article do 
              resources :links , :path => "url"
            end 
          end
        end
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-07-01
          • 2017-11-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多