【问题标题】:Overriding Public folder based on namespace Rails 3基于命名空间 Rails 3 覆盖公共文件夹
【发布时间】:2023-03-25 10:15:01
【问题描述】:

搜索了几个小时后,我在 Stack Overflow 上发布了我的第一个问题。

鉴于:我有以下 route.rb:

 resource: :non_namespaced_resource

 namespace :namespaced_resource do  # an example could be :admin
   resources :one_nested_resource
   resources :another_nested_resource
 end

期望的结果:就是让命名空间的资源使用自己的资产,非命名空间的资源使用默认资产,如下图:

# non-namespaced
/public
/public/images
/public/javascripts
/public/stylesheets

# namespaced
/admin
/admin/images
/admin/javascripts
/admin/stylesheets

我已经看到有关更改 config/environments/*.rbconfig/application.rb 并使用类似以下内容的信息,但找不到任何基于命名空间的示例。

请记住,只有两个命名空间 ADMIN 和 PUBLIC。

config.action_controller.asset_path
config.action_controller.asset_dir
config.action_controller.javascripts_dir
config.action_controller.stylesheets_dir
config.action_controller.images_dir

问题:看来这应该是可能的。所以我的问题是,这可能吗?如果是这样,怎么做?提前致谢。

【问题讨论】:

    标签: ruby-on-rails-3 overriding public directory-structure


    【解决方案1】:

    这比我习惯的要麻烦一些,但我希望它有所帮助。

    第一步是识别一些只为您的admin 命名空间运行的代码。我可能会创建另一个应用程序控制器,可能是admin_application_controller.rb,它从您的基本应用程序控制器扩展而来,然后从 that 控制器扩展为您的所有管理控制器。例如。

    # your basic applications controller
    class ApplicationController < ActionController::Base
      protect_from_forgery
      # etc
    end
    
    # your public controllers subclass it
    class UsersController < ApplicationController
      # stuff
    end
    
    # now your "specialized" admin controller
    class AdminApplicationController < ApplicationController
      before_filter :setup_asset_paths
    
      def setup_asset_paths
        Rails.application.config.action_controller.assets_dir = File.expand_path(File.join(Rails.root, 'admin'))
        Rails.application.config.action_controller.javascripts_dir = File.expand_path(File.join(Rails.root, 'admin', 'javascripts'))
        Rails.application.config.action_controller.stylesheets_dir = File.expand_path(File.join(Rails.root, 'admin', 'stylesheets'))
        Rails.application.config.action_controller.page_cache_directory = File.expand_path(File.join(Rails.root, 'admin'))
      end
    end
    
    # and your admin controllers extend from THAT instead
    class AdminUsersController < AdminApplicationController
      # more admin-y stuff
    end
    

    我很想知道这是否适合您,如果不适合,您遇到了什么问题以及您发现了什么,所以请告诉我们!祝你好运!!

    [编辑] 我更新了上面的代码以反映可用的成员:

    pp Rails.application.config.action_controller
    {:perform_caching=>false,
     :assets_dir=>"/Users/BinaryMuse/src/postecho/public",
     :javascripts_dir=>"/Users/BinaryMuse/src/postecho/public/javascripts",
     :stylesheets_dir=>"/Users/BinaryMuse/src/postecho/public/stylesheets",
     :page_cache_directory=>"/Users/BinaryMuse/src/postecho/public",
     :helpers_path=>["/Users/BinaryMuse/src/postecho/app/helpers"]}
    

    【讨论】:

    • 好吧,我试了一下,幸运的是,这是不行的!但是你的方法让我进一步挖掘,因为这似乎是应该发生的方式。这让我找到了 railties/lib/rails/engine/configuration.rb,在那里我找到了实际的路径对象。这使我搜索并找到了 Macklin 的 stackoverflow.com/questions/4600364/…,它正在工作,但是当我启动服务器以检查请求并根据请求动态设置时,我需要以某种方式注入一个条件.所以这让我觉得我可能需要
    • (cont'd) 创建一个 Rack 应用程序,以便在加载文件(样式表等)时将这个测试包含在 ActionView 或 ActionController 的某处,并添加我自己的 path.public 等效于 paths.admin(以及 /stylesheets 和 /javascripts)。如果您有任何想法,我很想知道......这可能是一个坚实的 ADMIN gem 保持公共和管理资产分开的良好基础。
    • @William 你遇到了什么错误(如果有的话)?我开始认为它应该是Rails.application.config.action_controller.assets_dir 等,而不仅仅是Rails.app.config ... 另请注意,我的解决方案缺少“资产”中的“s”,所以如果您复制/粘贴,对不起!
    • 好吧,我会仔细检查,我很确定我使用的是 application 而不是 app,我使用的是 assets 因为我复制了我在之前的搜索中找到它的那部分代码。它没有抛出任何错误,只是忽略了设置。我认为当我们到达控制器时(即使使用 before_filters)更改这些路径为时已晚,而 railties/lib/rails/engine/configuration.rb 路径方法中的那些似乎优先。这让我相信它需要将自己作为机架应用程序或引擎/插件插入。明天我会继续调查(*打哈欠)。
    • 我从来没有解决过这个问题。但现在它是古老的历史。如果我知道怎么做,可能会关闭它。
    猜你喜欢
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多