Rails通过非常复杂的条件来渲染按钮



我的rails应用程序成员可能具有两个不同的角色之一:vip_lite和vip。他们可以订阅计划以续订授权。

我们还有四种类型的计划:vip_lite/monthly、vip_lity/year、vip/monthly和vip/year。

vip用户可能正在订阅四个计划中的一个,vip_lite也是如此。不同角色、不同计划的会员可以在计划页面看到不同的按钮(例如vip_lite和订阅vip_lite/monthly会员可以在vip计划页面看到"升级"按钮(。

请参阅以下示例代码:(当前在助手中写入(

def plan_action_button(user)
if user.vip? && user.subscribing_plan?(:vip_lite, :monthly)
'button_a'
elsif user.vip? && user.subscribing_plan?(:vip_lite, :yearly)
'button_b'
elsif user.vip? && user.subscribing_plan?(:vip, :monthly)
'button_c'
elsif user.vip? && user.subscribing_plan?(:vip, :monthly)
'button_d'
elsif user.vip_lite? && user.subscribing_plan?(:vip, :monthly)
'button_e'
elsif user.vip_lite? && user.subscribing_plan?(:vip, :yearly)
'button_e'      
... and so on...
end
end

因此,我必须为这些页面中的每个按钮处理2*4=8个条件。铁路上有没有一个好的模式来处理这种情况?感谢

这里可以使用一些有趣的模式。让我们看看重复次数最多的是什么:user.vip?

让我们从保护子句开始这个方法

def plan_action_button(user)
return 'whatever you need to return' unless user.vip?
if user.subscribing_plan?(:vip_lite, :monthly)
'button_a'
[...]

然后,因为有很多组合,很难判断这些按钮有什么变化,什么保持不变。它是I18n密钥吗?按钮标签是否有不同的链接?您是否可以分别访问user.plan_nameuser.plan_frequency等部件?

回答这些问题将有助于你看到一种模式的出现。

最新更新