Rails:是否可以使用插值字符串引用实例变量(如@ user.color_preferred)?

时间:2011-09-13 15:45:28

标签: ruby-on-rails sass

我正在尝试使用模型User中定义的字段color_preferred来更改背景颜色。

/ * file example.css.scss.erb * /

$color: <%= @user.color_preferred %>; 


body {
    background-color: $color;
    color: #333;
    font-family: verdana, arial, helvetica, sans-serif;
    font-size: 13px;
    line-height: 18px; }

是否可以从sass文件中访问ruby实例变量? TK。 拉法。

3 个答案:

答案 0 :(得分:3)

我相信,这是不可能的。 Sass在部署时编译(在Rails 3.1中),之后它是一个静态文件。这也没有任何意义。 css文件应该独立于用户并且可以长时间安装。

如果用户选择了首选颜色,为什么不在布局中插入样式标记并覆盖css中定义的默认样式?

答案 1 :(得分:1)

是。您可以通过扩展Sass::Script::Functions来实现此目的。只需创建一个ruby文件,添加该位,然后将其加载到脚本的环境中(即/ config / initializers /):

module Sass::Script::Functions
  def var(name)
    assert_type name, :String, :name
    @environment.var(name.value)
  end

  declare :var, :args => [:string]
end

然后你可以做这样的事情:

$button-primary-bg: #000;
$button-secondary-bg: #123;
$button-tertiary-bg: #abc;

$button-names: (primary, secondary);

@each $name in $names {
  .button-#{$name} { background: var("button-#{$name}-bg"); }
} 

答案 2 :(得分:0)

这是可能的,但它涉及黑客攻击Sass并深入其中。更好的方式就像iGel所说的那样,根据用户的喜好创建不同的“主题”并将其包含在您的身体中。

假设你有一个main.css和一些主题颜色(根据用户的选择说不同的身体背景)

 = stylesheet_include_tag 'main'
 = stylesheet_include_tag "#{@user.color_preferred}"

然后你有一些预制的颜色,如blue.sass,red.sass,green.sass等。

很容易生成这些,因为您可以像在示例中一样使用变量,除非您必须重现它以支持不同的颜色。