【问题标题】:Rails: Is it possible to reference a instance variable (like @user.color_preferred) with an interpolated string?Rails:是否可以使用插值字符串引用实例变量(如@user.color_preferred)?
【发布时间】:2015-09-16 23:46:16
【问题描述】:

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

/* 文件 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。 拉法。

【问题讨论】:

    标签: ruby-on-rails sass


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      是的。您可以通过扩展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"); }
      } 
      

      【讨论】:

        【解决方案3】:

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

        假设您有一个 main.css 和一些主题颜色(根据用户的选择说不同的 body-background)

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

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

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

        【讨论】:

          猜你喜欢
          • 2011-08-25
          • 2023-03-31
          • 2017-03-24
          • 1970-01-01
          • 2019-06-13
          • 1970-01-01
          • 2021-07-22
          • 2017-08-08
          • 1970-01-01
          相关资源
          最近更新 更多