【问题标题】:Accessing Rails Controller instance variables in CSS在 CSS 中访问 Rails 控制器实例变量
【发布时间】:2012-12-06 07:35:54
【问题描述】:

所以我看到很多关于在你的 CSS 文件中使用 erb 的讨论。我可以让 ERB 通过使用 语法并将 .erb 添加到文件中来处理 CSS 文件,但我真正需要的是访问控制器中的实例变量。

searches_controller.rb

def new
  @search = Search.new
  @school = School.find(params[:school])
end

我真正想做的是:

searches.css.scss.erb

h1.logo {
  color: <%= @school.primary_color %>;
}

但是 ERB 会抛出一个错误,因为 @school 是 nil。有没有办法要求控制器访问这些实例变量?

我能想到的唯一其他方法是将其作为数据属性嵌入到视图中,然后使用 JS 在前端进行更改。这让我觉得这可能更好,因为 CSS 文件不会更改并且每次都需要重新发送,但它也不会那么优雅。

【问题讨论】:

    标签: ruby-on-rails ruby erb instance-variables scoping


    【解决方案1】:

    您还需要考虑,在预编译资产场景中,CSS 将在编译期间通过 Sprockets 运行,因此您最终会得到静态颜色(假设 @school 实际实例化了它不会是)。这是不可取的,因为每个学校都会有相同的颜色(无论在编译阶段发生了什么)。

    对于像这样的自定义品牌,我们让我们的用户指定他们的颜色,并在布局中包含一个 CSS 块:

    :css
        h1.logo {
            color: <%= @school.primary_color %>;
        }
    

    这并不理想,但如果你有少量的定制似乎工作得相当好。

    【讨论】:

    • 谢谢。我希望在视图之外处理它,但似乎这是要走的路。
    • 您能否提供更多关于向布局中添加 CSS 块的详细信息...?我想根据屏幕大小交换图像,并且需要一种方法让我的媒体查询查看我的实例变量。
    【解决方案2】:

    在您看来,我宁愿使用@school.primary_color。这应该有效:

    <h1 style="color:#{@school.primary_color}">@school.name</h1>
    

    请记住使用双引号进行插值。

    【讨论】:

    • 我尽量早点处理 nil。所以在这种情况下,视图永远不会被提供nil 对象。但如果这是一个问题,那么整个视图应该真正包含在一个条件中。它不仅仅针对这种用法。
    • 唯一的问题是,如果您必须在多个视图的多个位置使用该颜色,您最终会得到一些非常难以维护的代码。
    • 这很好。根据学校的数量,在每个学校的 CSS 文件中而不是在数据库中定义常量甚至可能是一个好主意。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-14
    • 1970-01-01
    • 2012-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多