使用rails helpers中的条件

时间:2015-05-12 12:24:28

标签: ruby-on-rails

我的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方法。

2 个答案:

答案 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