module DynamicScaffold::ControllerUtilities

Private Instance Methods

bind_sorter_value(record) click to toggle source
# File lib/dynamic_scaffold/controller_utilities.rb, line 121
def bind_sorter_value(record)
  attr = dynamic_scaffold.list.sorter_attribute
  value = dynamic_scaffold.model.maximum(attr)
  record[attr] = value ? value + 1 : 0
end
check_max_count!() click to toggle source
# File lib/dynamic_scaffold/controller_utilities.rb, line 131
def check_max_count!
  return if dynamic_scaffold.max_count.nil?

  instance_exec(@record, &dynamic_scaffold.lock_before_count) if dynamic_scaffold.lock_before_count
  count_query = dynamic_scaffold.list.build_sql(scope_params)
  count_query = count_query.lock if dynamic_scaffold.max_count_options[:lock]
  count = count_query.count
  raise Error::InvalidOperation, 'You can not add any more.' if dynamic_scaffold.max_count?(count)
end
dynamic_scaffold_path(action, options = {}) click to toggle source
# File lib/dynamic_scaffold/controller_utilities.rb, line 105
def dynamic_scaffold_path(action, options = {})
  route = Rails.application.routes.routes.find do |r|
    route_params = r.required_defaults
    route_params[:controller] == params[:controller] && (route_params[:action] == action.to_s && r.name)
  end

  if route.nil?
    raise DynamicScaffold::Error::RouteNotFound,
      "Missing controller#action #{params[:controller]}##{action}"
  end

  options.merge!(scope_params)

  public_send("#{route.name}_path", options)
end
edit_params() click to toggle source

Get parameters for edit action. `key => value`

# File lib/dynamic_scaffold/controller_utilities.rb, line 32
def edit_params
  params.permit(*dynamic_scaffold.model.primary_key)
end
find_record(params) click to toggle source
# File lib/dynamic_scaffold/controller_utilities.rb, line 98
def find_record(params)
  rec = dynamic_scaffold.model.find_by(params.merge(scope_params))
  raise ::ActiveRecord::RecordNotFound if rec.nil?

  rec
end
handle_pagination(query) click to toggle source
# File lib/dynamic_scaffold/controller_utilities.rb, line 141
def handle_pagination(query)
  return query unless dynamic_scaffold.list.pagination

  query
    .page(params[dynamic_scaffold.list.pagination.param_name])
    .per(dynamic_scaffold.list.pagination.per_page)
end
next_sequence!() click to toggle source
# File lib/dynamic_scaffold/controller_utilities.rb, line 88
def next_sequence!
  val = @sequence
  if dynamic_scaffold.list.sorter_direction == :asc
    @sequence += 1
  elsif dynamic_scaffold.list.sorter_direction == :desc
    @sequence -= 1
  end
  val
end
pkey_string_to_hash(pkey) click to toggle source

Convert pkey_string value to hash.

# File lib/dynamic_scaffold/controller_utilities.rb, line 24
def pkey_string_to_hash(pkey)
  # https://github.com/gomo/dynamic_scaffold/pull/9/commits/ff5de0e38b3544347e82539c45ffd2efaf3410da
  # Stop support multiple pkey, on this commit.
  # Convert "key:1,code:foo" to {key: "1", code: "foo"}
  pkey.split(',').map {|v| v.split(':') }.each_with_object({}) {|v, res| res[v.first] = v.last }
end
request_queries(*except) click to toggle source
# File lib/dynamic_scaffold/controller_utilities.rb, line 127
def request_queries(*except)
  request.query_parameters.to_hash.symbolize_keys.delete_if {|k, _v| except.select(&:present?).include?(k) }
end
reset_sequence(record_count) click to toggle source
# File lib/dynamic_scaffold/controller_utilities.rb, line 80
def reset_sequence(record_count)
  if dynamic_scaffold.list.sorter_direction == :asc
    @sequence = 0
  elsif dynamic_scaffold.list.sorter_direction == :desc
    @sequence = record_count - 1
  end
end
scope_params() click to toggle source

Get the hash of the key and value specified for the scope.

# File lib/dynamic_scaffold/controller_utilities.rb, line 6
def scope_params
  return {} if dynamic_scaffold.scope.nil?

  case dynamic_scaffold.scope
  when Array then
    dynamic_scaffold.scope.each_with_object({}) do |val, res|
      if val.is_a? Hash
        val.each {|k, v| res[k] = v }
      else
        res[val] = params[val]
      end
    end
  when Hash then
    dynamic_scaffold.scope
  end
end
sort_params() click to toggle source

Get paramters for sort action. `pkeys[] => value`

# File lib/dynamic_scaffold/controller_utilities.rb, line 37
def sort_params
  params
    .require('pkeys')
    .map {|p| p.permit(*dynamic_scaffold.model.primary_key) }
end
update_values() click to toggle source

Get paramters for update record.

# File lib/dynamic_scaffold/controller_utilities.rb, line 44
def update_values # rubocop:disable Metrics/AbcSize
  # set the parameters of carrierwave_image at the end for validates.
  permitting = []
  dynamic_scaffold.form.items.reject {|i| i.type?(:carrierwave_image) }.each do |item|
    item.extract_parameters(permitting)
  end
  permitting.concat(dynamic_scaffold.form.permit_params)
  dynamic_scaffold.form.items.select {|i| i.type?(:carrierwave_image) }.each do |item|
    item.extract_parameters(permitting)
  end

  values = params
             .require(dynamic_scaffold.model.name.underscore)
             .permit(*permitting)

  if dynamic_scaffold.scope && !valid_for_scope?(values)
    raise DynamicScaffold::Error::InvalidOperation, "You can update only to #{scope_params} on this scope"
  end

  values
end
valid_for_scope?(update_params) click to toggle source

Check if there are inconsistent scopes in update parameters

# File lib/dynamic_scaffold/controller_utilities.rb, line 67
def valid_for_scope?(update_params)
  return true if dynamic_scaffold.scope_options[:changeable]

  result = true
  scope_params.each do |key, value|
    if update_params.key?(key) && update_params[key] != value
      result = false
      break
    end
  end
  result
end