有条件地在视图中添加一个css类,而不是使用erb?

时间:2016-06-28 00:30:59

标签: ruby-on-rails ruby

是否有可能,如果有,是否建议?

如果条件为真,我想在元素中添加一个类。我能弄清楚如何做到这一点的唯一方法是在视图中使用erb,例如:

<div <%= if @status == 'success'; "class='do-something'"; end %>>
   message
</div>

或使用div_for,但它很混乱,而我宁愿使用模型/控制器本身中的帮助器或方法设置html元素的类。类似的东西:

如果操作成功,请以某种方式(按数据属性,按类等)查找html元素并向其中添加一个类。

3 个答案:

答案 0 :(得分:1)

有很多方法可以做你想做的事。这是一个:

<%= content_tag :div, message, class: ("do-something" if @status == "success") %>

如果你想成为帮手,那也很容易:

def message(status, message=nil, &block)
  css_class = "do-something" if @status == success
  if block
    content_tag(:div, class: css_class, &block)
  else
    content_tag(:div, message, class: css_class)
  end
end

然后:

<%= message @status do -%>
  Message
<% end %>

或者:

<%= message @status, "Message" %>

答案 1 :(得分:0)

  

有条件地在视图中添加css类,而不是使用erb?

您可以使用Nokogiri解析您的视图,然后修改html:

  def some_action
    status = 'success'
    @planet = 'mars' #ERB variable

    if status == 'success'
      html = render_to_string  #The view after executing the ERB 
                               #and applying the ERB variables and
                               #adding the layout.

      doc = Nokogiri::HTML html
      target_class = 'title'

      tags_containing_target_class = doc.xpath(
        "//*[contains(concat(' ', normalize-space(@class), ' '), ' #{target_class} ')]"
      )  #A well known method to search a class like class="title   bold"
         #or class="bold   title"

      class_to_add = 'highlight'

      tags_containing_target_class.each do |tag|
        tag['class'] = tag['class'] << " #{class_to_add}"
      end

      render text: doc.to_html
    end
  end

答案 2 :(得分:-2)

这应该有效

 <div class=<%= @status == 'success' ? 'do-something' : '' %>>
 </div>