在使用资产管道时,如何为rails中的功能开关创建“条件资产”?

时间:2014-10-04 22:49:32

标签: ruby-on-rails ruby-on-rails-4 conditional asset-pipeline assets

我正在实施功能开关'因此,管理员可以使用管理员Web界面打开和关闭新功能。

我可以在视图中轻松完成此操作,例如

- if FeatureSwitch.where(name: 'display_demo_feature_switch_image', status: 'on').count > 0 
  # in reality would refactor that query to the controller/model. put here for clarity.
  %br
  %br
  %div{class: "onoffswitch"}
    %input{type: "checkbox", name: "onoffswitch", class: "onoffswitch-checkbox", id: "myonoffswitch"}
    %label{class: "onoffswitch-label", for: "myonoffswitch"}
      %span{class: "onoffswitch-inner"}
      %span{class: "onoffswitch-switch"}

但是,当我使用资产管道并使资产有条件地“处理”时,我怎样才能在视图中执行此操作。包括?

所以如果我有一个css资产清单(app/assets/stylesheets/application.css):

/*
 *= require_self
 *= require main
 *= require default
 *= require on_off_switch
 *= require jquery-ui-1.8.22.custom.css
*/

我如何制作require on_off_switch"条件",取决于来自

的真/假回报
FeatureSwitch
  .where(name: 'display_demo_feature_switch_image', status: 'on').count > 0  

我尝试将application.css重命名为application.css.erb并使用

<% if 'abc' == 'def' %> # While developing/testing
 *= require on_off_switch
<% end %>

但是,尽管'abc' == 'def'是假的......

,资产总是包含在内

2 个答案:

答案 0 :(得分:0)

一种可能的解决方案是创建两个清单,例如on.css和off.css

在你的控制器中添加一个before_filter:

def my_before_filter_name
  @count = FeatureSwitch.where(name: 'display_demo_feature_switch_image', status: 'on').count
end

顺便说一句,请避免在视图中使用有效记录。

在你的布局中:

- if @count > 0
  = stylesheet_link_tag 'on.css'
- else
  = stylesheet_link_tag 'off.css'

请注意,您可能需要测试@count是否存在。

如果此解决方案不是您的最佳选择,您可以使用content_for。在你的布局产量:on_off并在你的视图中添加一个content_for:on_off并测试@count到stylesheet_link_tag&#39; on_off_switch&#39; (rails documentation

中的更多详细信息

答案 1 :(得分:0)

解决方案似乎只是将条件放在最上面

app/views/layout/application.html.haml #  (I use haml instead of erb)

= stylesheet_link_tag 'application'
- if FeatureSwitch.where(name: 'display_demo_feature_switch_image', status: 'on').count > 0
  = stylesheet_link_tag 'on_off_switch'

但是虽然这在开发中起作用,但它并没有在生产中进行,并且不会包含样式表。