2016-09-07 2 views
0

Railsアプリケーションでは、設定ファイルを使用して「テーマ」を切り替えることができます。テーマは動的に切り替える必要はありません(実行中は、アプリケーション起動時に認識されます)。アセットに別のフォルダを使用する

stylesheetsディレクトリをassetsディレクトリから、/app/themes/[themename]/assets/stylesheetsというフォルダに移動しました。

アイデアは、/app/themesディレクトリに複数のフォルダを持ち、アプリケーションで使用することができます。

メモ:私はjavascriptsフォルダをassetsフォルダから移動しませんでした。なぜなら、それはまだグローバルに使用したいからです。私の資産がどこにある

もちろん<%= stylesheet_link_tag "#{controller_name}" if MyApp::Application.assets.find_asset("#{controller_name}") %>

は、私のアプリケーションは、もはや知っていて、それが私のページ、資産を提供しています:私のレイアウトでは

私は、コントローラの特定のスタイルシートをロードするには、次のコードを使用しません(上記のifチェックのために)読み込まれていません。

私はそれがまたテーマディレクトリから資産をロードすることを確認するために私のconfig/initializers/assets.rbに次のコードを追加しました:

Dir.glob("#{Rails.root}/app/themes/#{Settings.site.theme}/assets/**/").each do |path| 
    Rails.application.config.assets.paths << path 
end 

Settings.site.themeが正しく充填され、今のスタイルシートが実際にロードされた文字列値ですウェブサイト。従ってYAY

しかし、ここではconfig.assets.compilefalseに変更すると、すべてが失敗します(テストとプロダクションでは失敗します)。

MyApp::Application.assets.find_asset("#{controller_name}")は、例外undefined method 'find_asset for nil:NilClass`を送出しています。

私はRails 5.0.0.1です。

誰でもこの問題を解決する方法がありますか?

答えて

1

もっと簡単な方法は、のテーマのネームスペースで、スタイルシートをにすることです。それは次のようにフォルダ構造を持って、次のとおりです。

- app 
    - assets 
    - stylesheets 
     - theme-blue 
     - application.scss 
     - theme-red 
     - application.scss 
    - javascripts 
     - application.js 

そして、あなたのレイアウトファイルで、あなただけのように、stylesheet_link_tagtheme-blue/applicationにを指す:これを行うには

<%= stylesheet_link_tag "theme-blue/application" %> 

もう一つの方法は、持っています複数のレイアウトがあり、1つはtheme-blue、もう1つはtheme-redです。コントローラでは、

class BlueController < ApplicationController 
    layout "theme_blue" 
end 

ファイルapp/views/layouts/theme_blue.html.erbには正しいCSSファイルが必要です。

scssファイルをconfig/assets.rbに追加する必要があるかもしれませんが、必要な場合はRailsから通知されます。

関連する問題