通过控制器返回的自定义CSS通过#show / n?format = css返回,但不是#show / n.css

时间:2013-11-04 12:45:26

标签: css ruby-on-rails ruby-on-rails-3.2

我正在为Rails 3.2应用程序实现自定义主题问题,每个主题都有非常少量的CSS覆盖。

虽然我到目前为止通过在布局文件中内联一些CSS(包括偶尔的Erb参数)来实现主题变体,但我真的想通过GET请求提供自定义CSS来整理它,例如: (假设current_theme已定义)

<%= 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 - 由theme_path帮助程序生成的网址格式 - 正在生成404.

我可能会忽略非常简单这里的一些东西 - 希望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似乎工作的事实实际上是因为,至少从命令行CURLing /themes/1返回必需的CSS。就我而言,那是一只红鲱鱼......

顺便说一句,将此行添加到routes.rb可以使用:

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

(使用稍微不同的路线,以免与routes.rb中的resources :themes冲突)。 themestyle_path(current_theme)生成了一条可行路线 - /themestyle/1 - 我可以添加&#39; text / css&#39;渲染阶段的类型标题没问题。我不得不手工编写<link rel="stylesheet">元素,因为stylesheet_link_tag会添加css后缀。

2 个答案:

答案 0 :(得分: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

我不知道这是否会正确生成路线,但它肯定是我会使用的方法

答案 1 :(得分:0)

我找到了问题的根源:rack-zippy gem,旨在帮助在heroku上提供GZIPped生产资产的中间件。

禁用该中间件可以使所有路由完全正常工作并传递给正确的控制器方法,并保留所有格式等。

感谢所有帮助过的人。