Переопределение общей папки на основе пространства имен Rails 3 - PullRequest
1 голос
/ 14 марта 2011

После поиска часов я публикую свой первый вопрос о переполнении стека.

Дано: У меня есть следующий 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/*.rb илиconfig/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 Ответ

1 голос
/ 14 марта 2011

Это немного больше, чем я привык, но я надеюсь, что это поможет.

Первым шагом будет определение кода, который выполняется только для вашего пространства имен 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"]}
...