覆盖基于命名空间Rails 3的公用文件夹

时间:2011-03-14 00:42:31

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

搜索了几个小时之后,我在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

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

1 个答案:

答案 0 :(得分:1)

这比我习惯的更多,但我希望它有所帮助。

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

# 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"]}