我如何在我的控制器中重构这段rails代码?

问题描述 投票:0回答:1

目前我的控制器里面有这个。

        @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])。

我在我的模型中为过滤器设置了params。

        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个回答
0
投票

你可以创建一个单独的类来处理这个问题。

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
© www.soinside.com 2019 - 2024. All rights reserved.