Module: DynamicScaffold::Controller

Extended by:
ActiveSupport::Concern
Includes:
ControllerUtilities
Defined in:
lib/dynamic_scaffold/controller.rb

Instance Method Summary collapse

Instance Method Details

#createObject



59
60
61
62
63
64
65
66
67
68
69
70
71
72
# File 'lib/dynamic_scaffold/controller.rb', line 59

def create
  @record = dynamic_scaffold.model.new
  prev_attribute = @record.attributes
  @record.attributes = update_values
  bind_sorter_value(@record) if dynamic_scaffold.list.sorter
  dynamic_scaffold.model.transaction do
    yield(@record, prev_attribute) if block_given?
    if @record.save
      redirect_to dynamic_scaffold_path(:index)
    else
      render "#{params[:controller]}/new"
    end
  end
end

#destroyObject



89
90
91
92
93
94
95
96
97
98
99
100
# File 'lib/dynamic_scaffold/controller.rb', line 89

def destroy
  # `Destroy` also does not support multiple primary keys too.
  record = find_record(dynamic_scaffold.model.primary_key => params['id'])
  begin
    dynamic_scaffold.model.transaction do
      record.destroy
    end
  rescue ::ActiveRecord::InvalidForeignKey => _error
    flash[:dynamic_scaffold_danger] = I18n.t('dynamic_scaffold.alert.destroy.invalid_foreign_key')
  end
  redirect_to dynamic_scaffold_path(:index)
end

#editObject



55
56
57
# File 'lib/dynamic_scaffold/controller.rb', line 55

def edit
  @record = find_record(edit_params)
end

#indexObject

Actions

Raises:



26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# File 'lib/dynamic_scaffold/controller.rb', line 26

def index # rubocop:disable Metrics/AbcSize
  @records = dynamic_scaffold.model.all
  raise Error::Controller, 'You must return ActiveRecord::Relation' unless @records.is_a? ::ActiveRecord::Relation

  if dynamic_scaffold.list.pagination
    @records = @records
                 .page(params[dynamic_scaffold.list.pagination.param_name])
                 .per(dynamic_scaffold.list.pagination.per_page)
  end

  @records = @records.where scope_params
  @records = @records.order dynamic_scaffold.list.sorter if dynamic_scaffold.list.sorter
  @records = @records.order(*dynamic_scaffold.list.order) unless dynamic_scaffold.list.order.empty?

  @records = yield(@records) if block_given?
  raise Error::Controller, 'You must return ActiveRecord::Relation' if @records.nil?
  @records
end

#newObject



45
46
47
48
49
50
51
52
53
# File 'lib/dynamic_scaffold/controller.rb', line 45

def new
  @record = dynamic_scaffold.model.new

  defaults = dynamic_scaffold.form.items.each_with_object({}) do |item, memo|
    memo[item.name] = item.default if dynamic_scaffold.model.column_names.include?(item.name.to_s)
  end

  @record.attributes = defaults.merge(scope_params)
end

#sortObject



102
103
104
105
106
107
108
109
110
111
112
113
114
# File 'lib/dynamic_scaffold/controller.rb', line 102

def sort
  pkeys_list = sort_params
  reset_sequence(pkeys_list.size)
  dynamic_scaffold.model.transaction do
    pkeys_list.each do |pkeys|
      rec = find_record(pkeys.to_hash)
      next_sec = next_sequence!
      rec[dynamic_scaffold.list.sorter_attribute] = next_sec
      rec.save
    end
  end
  redirect_to dynamic_scaffold_path(:index)
end

#updateObject



74
75
76
77
78
79
80
81
82
83
84
85
86
87
# File 'lib/dynamic_scaffold/controller.rb', line 74

def update
  values = update_values
  @record = find_record(extract_pkeys(values))
  prev_attribute = @record.attributes
  @record.attributes = values
  dynamic_scaffold.model.transaction do
    yield(@record, prev_attribute) if block_given?
    if @record.save
      redirect_to dynamic_scaffold_path(:index)
    else
      render "#{params[:controller]}/edit"
    end
  end
end