Ruby on rails 基于枚举更改类颜色
我有一个这样的训练模型:Ruby on rails 基于枚举更改类颜色,ruby-on-rails,ruby,class,enums,Ruby On Rails,Ruby,Class,Enums,我有一个这样的训练模型: class Workout < ApplicationRecord belongs_to :user validates :date, :kind, presence: true validates :template, inclusion: { in: [true, false] } enum kind: { other: 0, swim: 1, bike: 2, run: 3 } has_many :comments, as: :co
class Workout < ApplicationRecord
belongs_to :user
validates :date, :kind, presence: true
validates :template, inclusion: { in: [true, false] }
enum kind: { other: 0, swim: 1, bike: 2, run: 3 }
has_many :comments, as: :commentable
end
td
.row
.col-md-6
= day.to_formatted_s(:short)
.col-md-6.text-right
= link_to 'Add +', new_team_user_workout_path(date: day, athlete: @athlete)
- unless @workouts[day].blank?
- @workouts[day].each do |workout|
= link_to team_user_workout_path(@team, current_user, workout, athlete: params[:athlete]) do
.workout
.workout-kind.text-semibold
= workout.kind.capitalize
- unless workout.distance.blank?
.workout-spec.text-light
| Distance:
|
= workout.distance/1000
| km
- unless workout.duration.blank?
.workout-spec.text-light
| Duration:
|
= workout.duration/60
| mins
如果enum是'swim',我想在训练中添加这样一个类:Workout.swim。如果enum为“bike”,则应附加Workout.bike类,以便我可以更改背景色
在Rails中这样做的最佳实践是什么
谢谢。您可以使用“询问”方式检查枚举对象。枚举?,因此您可以执行以下操作:
.workout{ class: ('swim' if workout.swim?) }
如果训练不是游泳,它不会打印任何内容
如果为每个可能的枚举定义了一个类,则还可以执行以下操作:
.workout{ class: workout.kind }
如果类swim已经定义,并且它与枚举同名,那么这将起作用。这听起来像是视图帮助器方法的一部分。。。rails的基本方法是在
/app/helpers/workout\u helper.rb
中放置一个方法。或者另一种常见的方法是创建“视图模型”,例如,使用,这样您就可以在WorkoutDecorator
类上定义该方法。但是,对于这一点没有唯一正确的答案。这实际上取决于应用程序的技术堆栈的外观。。。例如,许多现代应用程序使用SPA前端;在这种情况下,训练种类-->颜色的映射可能是用JavaScript定义的,而不是ruby。您可以简单地在类列表中添加种类,为不同的类添加css,例如.swim{background color:“#ff0000”}
。其他{background color:#f0f0f0”}
感谢您的回复@TomLord。如果我选择了helper方法,你能详细说明一下这个函数是什么样子的吗?我还在学习Rails atm。而且,应该说@TomLord不仅仅是“游泳”课。根据训练项目是游泳、自行车、跑步还是其他,它应该有不同的背景色。谢谢你的回答,塞巴斯蒂安。我假设我可以添加到该行以检查多个枚举。训练{课程:('swim'如果训练。swim?('bike'如果训练。bike?)}。对吗?另外,您是否知道此项的SLIM语法?在这种情况下,workout.swimswim':“bike”
考虑到只有两个枚举值可用。或者也可以只打印种类值训练。种类应打印或“游泳”或“自行车”。不确定,但您可以尝试div class=(workout.swim??“swim:”bike')
@Andy。实际上,您非常喜欢只打印锻炼.kind并将其附加为一个类的想法。我会看看我能不能做到。很好的解决方案。我通过添加.workout class=“#{workout.kind}”使其生效。谢谢