3

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

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

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

在我的主题控制器.rb 中:

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

show.css.erbviews/themes.

我的主要问题是/themes/1?format=css正确加载和呈现 CSS 文件。但是,帮助程序/themes/1.css生成的 URL 形式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是因为,至少在从命令行进行 CURL 时,/themes/1正在返回必要的 CSS。就我而言,这是一个红鲱鱼......

顺便说一句,将此行添加到routes.rb作品中:

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

(使用稍微不同的路由,以免与resources :themesroutes.rb 中的冲突)。themestyle_path(current_theme)生成一个可行的路线/themestyle/1——我可以在渲染阶段添加'text/css'类型的标题没问题。不过,我必须手动编写一个<link rel="stylesheet">元素,因为 stylesheet_link_tag 添加了 css 后缀。

4

2 回答 2

0

我不知道这是否正确,但我看到您的错误是您正在尝试使用 acontroller action来完成 a 的工作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

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

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

感谢所有帮助过的人。

于 2013-11-04T15:17:28.750 回答