3

各テーマに非常に少数の CSS オーバーライドを使用して、Rails 3.2 アプリのカスタム テーマの問題を実装しています。

current_themeこれまでのところ、いくつかの CSS (時折の Erb パラメーターを含む) をレイアウト ファイル内にインライン化することでテーマのバリエーションを実装しましたが、GET 要求を介してカスタマイズ CSS を配信することでこれを整理したいと思います。

<%= stylesheet_link_tag theme_path(current_theme, format: :css) %>

私のthemes_controller.rbで:

class ThemesController < ApplicationController
  respond_to :css
  ...
  def show
    @theme = Theme.find(params[:id])
    respond_with @theme
  end
end

に必要なshow.css.erbファイルがありますviews/themes

私の主な問題は/themes/1?format=css、CSS ファイルを正しく読み込んでレンダリングすることです。ただし、ヘルパー/themes/1.cssによって生成される URL の形式では、404 が生成されます。theme_path

ここで非常に単純なことを見落としている可能性があります。うまくいけば、仲間の SO ユーザーが、私の頭とレンガの壁がよりよく知られるのを防ぐために、ブルーミングの明白な点を指摘してくれることを願っています...

更新: Rails ルート認識デバッグのボットを実行:

r = Rails.application.routes
#=> #<ActionDispatch::Routing::RouteSet:0x007fc385016170>
r.recognize_path '/themes/1.css'
#=> {:action=>"show", :controller=>"themes", :id=>"1", :format=>"css"}
r.recognize_path '/themes/1?format=css'
#=> {:action=>"show", :controller=>"themes", :id=>"1"}

したがって、実際に機能している?format=cssように見えるのは、少なくともコマンドラインから CURL を実行すると/themes/1、必要な CSS が返されるためです。私に関する限り、それはニシンです...

ちなみに、この行を作品に追加するroutes.rb

  get '/themestyle/:id' => 'themes#show', as: 'themestyle', format: 'css'

resources :themes( routes.rbと競合しないように、少し異なるルートを使用します)。themestyle_path(current_theme)実行可能なルートを生成します – /themestyle/1– 問題なくレンダリング段階で「text/css」タイプのヘッダーを追加できます。<link rel="stylesheet">stylesheet_link_tag は css サフィックスを追加するので、要素を手作業でコーディングする必要があります。

4

2 に答える 2

0

これが正しいかどうかはわかりませんが、あなたのエラーは、を使用controller actionしての仕事をしようとしていることがわかりますhelper

コントローラー アクションは HTTP リクエストでのみ呼び出されます。私の経験では、ビュー/レイアウトからアクションにリンクするだけでアクションを呼び出すことはできません。バックエンドまたは ajax などを介してアクションを明示的に呼び出す必要があります。


アクションをヘルパーに変更

<%= stylesheet_link_tag theme(current_theme) %>


#app/controllers/application_controller.rb
def theme
    return theme_path(params[:id])
end
helper_method :theme

これがルートを正しく生成するかどうかはわかりませんが、確かに私が使用する方法です

于 2013-11-04T13:09:34.760 に答える
0

問題の原因を突き止めました。heroku で GZIP された運用アセットを提供するために設計された、 rack-zippy gem、ミドルウェアです。

そのミドルウェアを無効にすると、ルートはすべて完全に正常に機能し、すべての形式などを保持して正しいコントローラー メソッドに渡されます。

助けてくれたすべての人に感謝します。

于 2013-11-04T15:17:28.750 に答える