我的rails应用程序中有一个简单的帮助器,它根据对象的状态设置一个css class
,如:
<li class='<%= car_color(car.state) %>'><%= car.model %></li>
在助手中它基本上是:
module CarHelper
def car_color(state)
if state == 'in service'
'car car-in-service'
elsif state == 'in garage'
'car car-in-garage'
else
'car'
end
end
end
它适用于我的用例。但是,如果有一个新要求,User
角色为customer
的人不应该看到此助手创建的颜色编码。
我的第一个想法是在控制器中检查用户是否应该能够看到颜色编码:
class CarsController < ApplicationController
before_action :is_customer?
# bunch of restful stuff
private
def is_customer?
@customer if current_user.roles.include? 'customer'
end
end
然后在我的助手中,我可以添加一行:
def car_color(color)
return 'car' if @customer
end
这符合要求,但它对我来说很有趣。现在我的助手依赖于@customer
,因为它是一个实例变量而被传递。另一种方法是明确地将user.role
传递给car_color
,或者根据user.role将条件中的所有调用包装到car_color
,这看起来更糟。
有没有办法根据不同的用户角色帮助为更多条件准备此代码?我的想法是做一些事情:
module CarHelper
def car_color(args)
set_color_for_role(args[:user_role]) if args[:user_role]
set_color_for_state(args[:car_state]) if args[:car_state]
end
private
def set_color_for_role(user_role)
# stuff
end
def set_color_for_state(car_state)
# stuff
end
end
我不经常使用rails helper,因为我主要是在角度工作,我想知道我是否缺少更清晰的OOP方法。
答案 0 :(得分:2)
使用draper
https://github.com/drapergem/draper gem并将此逻辑移至装饰器
答案 1 :(得分:2)
我没有看到在帮助方法中检查当前用户角色的任何问题。
您可以将检查行为移动到用户模型,虽然这会使事情更清晰(您当然可能想要将其概括为多个角色):
class User < ActiveRecord::Base
def is_customer?
self.roles.include?('customer')
end
end
然后在您的助手中,您可以检查是否current_user.is_customer?
def car_color(state)
if current_user.is_customer?
'car'
else
if state == 'in service'
'car car-in-service'
elsif state == 'in garage'
'car car-in-garage'
else
'car'
end
end
我发现有时建立一个类的数组也很有用,这通常更清晰(我也被抛出):
def car_color(state)
car_classes = ['car']
unless current_user.is_customer?
car_classes << case state
when 'in service' then 'car-in-service'
when 'in garage' then 'car-in-garage'
end
end
car_classes.join(" ")
end