【问题标题】:How can I refactor this rails code in my controller?如何在我的控制器中重构这个 rails 代码?
【发布时间】:2020-04-20 01:16:55
【问题描述】:

我目前在我的控制器中有这个:

        @employees = Employee.all
        #need to keep params different because of nested route(id) and filter form params
        if !params[:employee].blank? && !params[:contact].blank?
            @logs = Log.both_filters(params[:employee], params[:contact]).date_ordered
        elsif params[:employee_id] 
            @logs = Log.by_employee(params[:employee_id]).date_ordered
        elsif !params[:employee].blank?
            @logs = Log.by_employee(params[:employee]).date_ordered
        elsif params[:contact_id]
            @logs = Log.by_contact(params[:contact_id]).date_ordered
        elsif !params[:contact].blank?
            @logs = Log.by_contact(params[:contact]).date_ordered
        else
            @logs = Log.all.date_ordered
        end
    end 

我必须设置两个不同的参数,因为索引也是员工和联系人的嵌套路由 (params[:contact_id]),然后我还想将加载与两个过滤器 (params[:contact]) 区分开来。

我为模型中的过滤器设置了参数:

        where(employee: employee_id)
    end 


    def self.by_contact(contact_id)
        where(contact: contact_id)
    end 

我的控制器中看起来有很多逻辑,并且有少量重复。我只在 Ruby on Rails 上,还没有 JS。

提前谢谢你!

【问题讨论】:

    标签: ruby-on-rails controller


    【解决方案1】:

    您可以创建一个单独的类来处理它:

    class LogFilter
      def initialize(args = {})
        @contact = args[:contact]
        @contact_id = args[:contact_id]
        @employee = args[:employee]
        @employee_id = args[:employee_id]
      end
    
      def call
        return Log.both_filters(employee, contact).date_ordered      if employee? && contact?
        return Log.by_employee(employee_id || employee).date_ordered if employee_id.present? || employee?
        return Log.by_contact(contact_id   || contact).date_ordered  if contact_id.present?  || contact?
    
        Log.all.date_ordered
      end
    
      private
    
      attr_reader :contact, :employee
    
      def contact?
        contact.present?
      end
    
      def employee?
        employee.present?
      end
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-11
      • 1970-01-01
      • 1970-01-01
      • 2011-09-24
      相关资源
      最近更新 更多