46 lines
962 B
Ruby
46 lines
962 B
Ruby
module ViewModels
|
|
class RecipeCriteria
|
|
|
|
SORT_COLUMNS = :created_at, :name, :rating, :total_time
|
|
PARAMS = [:sort_column, :sort_direction, :page, :per, :name, :tags]
|
|
|
|
attr_accessor *PARAMS
|
|
|
|
def initialize(params = nil)
|
|
params ||= {}
|
|
PARAMS.each do |attr|
|
|
setter = "#{attr}="
|
|
if params[attr]
|
|
self.send(setter, params[attr])
|
|
end
|
|
end
|
|
end
|
|
|
|
def sort_column
|
|
default(@sort_column.to_s.to_sym, SORT_COLUMNS.first, ->(v) {SORT_COLUMNS.include?(v)} )
|
|
end
|
|
|
|
def sort_direction
|
|
default(@sort_direction.to_s.to_sym, :desc, ->(v) {[:asc, :desc].include?(v)} )
|
|
end
|
|
|
|
def page
|
|
default(@page, 1, ->(v) { v.to_i > 0 })
|
|
end
|
|
|
|
def per
|
|
default(@per, 50, ->(v) { v.to_i > 0 })
|
|
end
|
|
|
|
protected
|
|
|
|
def default(val, default_val, valid_proc)
|
|
if val.blank? || !valid_proc.call(val)
|
|
default_val
|
|
else
|
|
val
|
|
end
|
|
end
|
|
|
|
end
|
|
end |