Ruby on rails HAML中一个元素的多个动态类
这是可行的,但很冗长。如何缩短这个Ruby on rails HAML中一个元素的多个动态类,ruby-on-rails,haml,Ruby On Rails,Haml,这是可行的,但很冗长。如何缩短这个 .service{:class=>[route.night??“night:”,route.school??“school:”]*“} 我希望此元素具有: class=“service”如果不是route.night?而不是route.school? class=“夜间服务”ifroute.night?而非route.school? class=“学校服务”如果没有route.night?和route.school? class=“学校夜间服务”ifrout
.service{:class=>[route.night??“night:”,route.school??“school:”]*“}
我希望此元素具有:
如果不是class=“service”
而不是route.night?
route.school?
ifclass=“夜间服务”
而非route.night?
route.school?
如果没有class=“学校服务”
和route.night?
route.school?
ifclass=“学校夜间服务”
和route.night?
route.school?
.service{:class=>[route.night??“night:”,route.school??“school:”]}
还可以做什么?我建议实现一个助手
def service_class_helper(route)
classes = ['service']
classes << 'night' if route.night?
classes << 'school' if route.school?
classes
end
如果不希望使用助手,可以使用类似
.service{:class => ['night', 'school'].select { |c| c if route.send("#{c}?") } }
这项工作非常简单。但也有一些明显的局限性。您可以这样做:
.service{class: {night: route.night?, school: route.school?}.map{|k,v| k if v} }
或者,如果您可以重构Route
类,您可以将其定义为:
class Route
def initialize(night: false, school: false)
@route_type = Set.new
@route_type.add('night') if night
@route_type.add('school') if school
end
def route_type
@route_type.to_a
end
def night?
@route_type.include? 'night'
end
def school?
@route_type.include? 'school'
end
end
现在你可以写作了
.service { class: route.route_type }
您不必调用
join
–如果您传递了类的数组,Haml将为您加入它:谢谢您的想法,但我希望是更短的,而不是更长的。:)我不喜欢编写特定于视图的帮助器方法。@matt谢谢,我从末尾删除了“*”,现在短了一点。好吧,帮助器就是为了这个原因。提取一些逻辑以保持视图干净好的,我同意这是有助手的一个很好的理由,但我仍然希望有更简洁的东西。:)希望我不是天真的。什么是路线?它如何回答学校?
和夜间?
?@urigassi路线
是一条公交路线,学校?
意味着它是一条校车路线,夜间?
意味着它是一条夜间路线。所以它是一个有两个布尔成员的类?
.service { class: route.route_type }