ruby-on-rails - 如何在我的控制器中重构这个 rails 代码?
问题描述
我目前在我的控制器中有这个:
@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。
先感谢您!
解决方案
您可以创建一个单独的类来处理它:
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
推荐阅读
- python - 使用 Ernie 进行文本分类 - 如何查看预测值
- windows-10 - 无法从网络共享运行 EXE
- java - 获取我的 .jar 文件旁边的文件夹的位置
- r - R write.csv2 输出显示空字符串
- tags - 如何根据标签列表过滤数据源 (AWS AMI)
- python - Numpy 数组 - 两个未知维度 - png 文件
- android - 在 Android Studio 中将图像保存到设备存储
- json - 渲染错误:“TypeError:无法读取未定义的属性''”
- mapbox - 如何将 Mapbox 矢量切片图层从 Geoserver 添加到 Mapbox?
- c# - 执行计算时无法解决此异常