Module: DynamicScaffold::Controller

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

Instance Method Summary collapse

Instance Method Details

#createObject



65
66
67
68
69
70
71
72
73
74
75
76
77
78
# File 'lib/dynamic_scaffold/controller.rb', line 65

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

#destroyObject



95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
# File 'lib/dynamic_scaffold/controller.rb', line 95

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')
  rescue StandardError => error
    flash[:dynamic_scaffold_danger] = I18n.t('dynamic_scaffold.alert.destroy.failed')
    logger.error(error)
  end
  redirect_to dynamic_scaffold_path(:index, request_queries)
end

#editObject



61
62
63
# File 'lib/dynamic_scaffold/controller.rb', line 61

def edit
  @record = find_record(edit_params)
end

#indexObject

Actions



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

def index # rubocop:disable Metrics/AbcSize
  @records = dynamic_scaffold.list.build_sql(scope_params)
  @count = @records.count unless dynamic_scaffold.max_count.nil?
  @records = handle_pagination(@records)
  @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?

  ret = yield(@records) if block_given?
  @records = ret unless ret.nil?
  unless @records.is_a? ::ActiveRecord::Relation
    raise(
      Error::InvalidOperation,
      'You must return ActiveRecord::Relation from super block'
    )
  end

  @records
end

#newObject

rubocop:disable Metrics/AbcSize



46
47
48
49
50
51
52
53
54
55
56
57
58
59
# File 'lib/dynamic_scaffold/controller.rb', line 46

def new # rubocop:disable Metrics/AbcSize
  unless dynamic_scaffold.max_count.nil?
    count = dynamic_scaffold.list.build_sql(scope_params).count
    raise Error::InvalidOperation, 'You can not add any more.' if dynamic_scaffold.max_count?(count)
  end

  @record = dynamic_scaffold.model.new

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

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

#sortObject



111
112
113
114
115
116
117
118
119
120
121
122
123
# File 'lib/dynamic_scaffold/controller.rb', line 111

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, request_queries)
end

#updateObject



80
81
82
83
84
85
86
87
88
89
90
91
92
93
# File 'lib/dynamic_scaffold/controller.rb', line 80

def update
  values = update_values
  @record = find_record(dynamic_scaffold.model.primary_key => params['id'])
  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, request_queries)
    else
      render "#{params[:controller]}/edit"
    end
  end
end