Rails 3: обслуживание статических ресурсов из разных мест в зависимости от темы

Я создаю простую систему тем для приложения rails 3. Тема состоит из папки, помещенной в Rails.root/themes, содержащей

  • Файл манифеста .yml
  • некоторые файлы шаблонов liquid
  • Подпапка статических ресурсов

Теперь для определенного контроллера/действия я хотел бы отображать представления из текущей темы и, соответственно, использовать статические ресурсы.

Следовательно, мне нужен способ сказать рельсам переписать

  • http://example.com/theme1/* ----> #{Rails.root}/themes/theme1/assets/*
  • http://example.com/theme2/* ----> #{Rails.root}/themes/theme2/assets/*
  • ...

В настоящее время я не могу понять, как это сделать, так как я хотел бы избежать использования разных движков для каждой темы или копирования файлов активов в подпапку public.

Как я могу решить эту проблему?

изменить: другие требования

Я искал что-то, что не нарушало бы значения по умолчанию для рельсов, таким образом, позже я мог бы воспользоваться новой функцией конвейера ресурсов (запланировано для рельсов 3.1).

На данный момент нашел только это:

config.asset_path = proc { |asset_path| "assets/#{asset_path}" } 

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


person mcasimir    schedule 01.07.2011    source источник
comment
Хороший вопрос, дайте мне знать, если вы разберетесь с этим. Меня очень интересует идея иметь простые темы, которые могут быть для каждого объекта.   -  person Andrew    schedule 01.07.2011
comment
Быстрый вопрос о том, что мне непонятно: вы показываете ресурсы из одной темы на странице за раз или страница может содержать ресурсы из нескольких тем одновременно?   -  person Dave A-R    schedule 04.07.2011
comment
@SaucyK: я показываю ресурсы из одной темы на одной странице, но это не обязательно: если кто-то знает URL-адреса ресурсов нескольких тем, им не запрещено их использовать (и я действительно не могу запретить им это делать). В настоящее время у меня есть несколько вспомогательных методов для встраивания ресурсов из текущей темы.   -  person mcasimir    schedule 06.07.2011


Ответы (1)


Взгляните на плагин themes_for_rails.

Следующие выдержки из файла readme показывают, как вы можете изменить используемую тему на основе любой необходимой вам логики.

В действии контроллера:

class MyController < ApplicationController
  def show
    theme "purple"
  end
end

На уровне класса в вашем контроллере:

class MyController < ApplicationController
  theme "purple" # all actions will use this theme
  def show
    ...
  end
end 

Или с помощью лямбда/функции "разрешителя":

class MyController < ApplicationController
  theme :theme_resolver
  # ...
private
  def theme_resolver
    current_user.theme # or anything else that return a string. 
  end
end

Есть также вспомогательные функции для ваших представлений и почтовых программ.

person VirtualStaticVoid    schedule 05.07.2011
comment
Я уже смотрел на это, меня интересовало только то, как он работает со статическими активами, так как я не хочу erb или haml ecc .. (может быть, я мог бы найти эту переопределяющую функцию render?). themes_for_rails выполняет всю работу сам: у него есть AssetsController, который отвечает за обслуживание ресурсов, и для этого используется функция «отправить». - person mcasimir; 06.07.2011
comment
Это решает мою проблему, но я искал что-то менее handwritten и более надежное, например промежуточное ПО для стоек или просто параметр конфигурации rails, чтобы воспользоваться преимуществами нового функция конвейера ресурсов, запланированная в rails 3.1. Я нашел только это: config.asset_path = proc { |asset_path| "assets/#{asset_path}" }, которое полностью соответствовало бы моим требованиям, но, к сожалению, не будет применяться при включенном конвейере активов. - person mcasimir; 06.07.2011