2012-12-19 65 views
6

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

searches_controller.rb

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

我真的很想做的是:

searches.css.scss.erb

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

但该局将抛出错误,因为@学校是零。有什么办法可以要求控制器访问这些实例变量吗?

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

回答

9

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

自定义品牌是这样,我们让我们的用户可以指定自己的颜色,包括CSS的布局块:

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

这是不理想的,但如果你有客户化的少数似乎工作得很好。

+0

谢谢。我希望在意见之外处理它,但似乎这是一条路。 – rurabe

+0

你能否提供更多关于添加css块到布局的细节......?我想根据屏幕大小交换图像,并且需要一种方法让我的媒体查询查看我的实例变量。 – brntsllvn

2

我宁可在您看来使用@school.primary_color。这应该工作:

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

只要记住使用双引号插入。

+0

我尽可能早地照顾零。所以在这种情况下,视图永远不会被赋予一个'nil'对象。但是,如果这是一个问题,那么整个观点应该真的被包装在一个条件。这不仅仅是这种用法。 – mehulkar

+0

唯一的问题是,如果你必须在多个视图中的多个位置使用该颜色,最终会得到一些不可维护的代码。 –

+0

这是一个很好的观点。根据学校数量的不同,在每个学校的CSS文件中定义常量,而不是在数据库中定义常量也许是个好主意。 – mehulkar

相关问题