Переопределение общей папки на основе пространства имен Rails 3

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

Дано: у меня есть следующий 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

Вопрос: кажется, что это должно быть возможно. Итак, мой вопрос (ы): возможно ли это? Если да, то как? Заранее спасибо.


person william e schroeder    schedule 14.03.2011    source источник


Ответы (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"]}
person Michelle Tilley    schedule 14.03.2011
comment
Ну, я попробовал, и, как назло, это было не так! Но ваш подход заставил меня копать дальше, поскольку, похоже, так и должно быть. Это привело меня к railties/lib/rails/engine/configuration.rb, где я нашел фактический объект пути. Это привело меня к поиску и нахождению этого stackoverflow.com/questions/4600364/ Маклина, который работает, но мне нужно как-то ввести условие, когда я запускаю сервер для проверки запроса и установить его на летать по запросу. Так что я подумал, что мне может понадобиться - person william e schroeder; 15.03.2011
comment
(продолжение), чтобы создать приложение Rack, чтобы включить этот тест где-нибудь в ActionView или ActionController в момент загрузки файлов (таблиц стилей и т. д.), а также добавить мой собственный эквивалент paths.public paths.admin (а также /stylesheets и /javascripts). Если у вас есть какие-либо идеи, я хотел бы знать... Это может стать хорошей основой для надежной жемчужины ADMIN, разделяющей общедоступные и административные активы. - person william e schroeder; 15.03.2011
comment
@William Какие ошибки вы получили (если есть)? Я начинаю думать, что это должно быть Rails.application.config.action_controller.assets_dir и т. д., а не просто Rails.app.config .... Также обратите внимание, что в моем решении отсутствовала буква s в активах, поэтому, если вы копируете/вставляете, извините за это! - person Michelle Tilley; 15.03.2011
comment
Что ж, я еще раз проверю, поскольку я уверен, что использовал application, а не app, и я использовал assets, когда копировал эту часть файла. код, откуда я нашел его в моем предыдущем поиске. Он не выдавал никаких ошибок, он просто игнорировал настройки. Я думаю, что к тому времени, когда мы доберемся до контроллера (даже с before_filters), уже будет слишком поздно менять эти пути, которые и те, что в методе пути railties/lib/rails/engine/configuration.rb, кажутся иметь приоритет. Это заставило меня поверить, что ему нужно вставить себя в качестве стоечного приложения или движка/плагина. Я продолжу свое расследование завтра (*зевает). - person william e schroeder; 15.03.2011
comment
Я так и не решил этого. Но теперь это древняя история. Возможно, я мог бы закрыть это, если бы знал, как. - person william e schroeder; 06.02.2015