是否有可能,如果有,是否建议?
如果条件为真,我想在元素中添加一个类。我能弄清楚如何做到这一点的唯一方法是在视图中使用erb,例如:
<div <%= if @status == 'success'; "class='do-something'"; end %>>
message
</div>
或使用div_for
,但它很混乱,而我宁愿使用模型/控制器本身中的帮助器或方法设置html元素的类。类似的东西:
如果操作成功,请以某种方式(按数据属性,按类等)查找html元素并向其中添加一个类。
答案 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>