Class: QuickDry::QuickDryController

Inherits:
ApplicationController show all
Defined in:
app/controllers/quick_dry/quick_dry_controller.rb

Instance Method Summary collapse

Instance Method Details

#append_route(proc: nil, &block) ⇒ Object Also known as: append_routes



144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
# File 'app/controllers/quick_dry/quick_dry_controller.rb', line 144

def append_route(proc:nil,&block)
  begin
    _routes = Rails.application.routes
    _routes.disable_clear_and_finalize = true
    _routes.clear!
    Rails.application.routes_reloader.paths.each{ |path| load(path) }

    _routes.draw &proc unless proc.blank?
    _routes.draw &block if block_given? and proc.blank?

    _routes.finalize!
  ensure
    _routes.disable_clear_and_finalize = false
  end
end

#createObject

POST /table_name POST /table_name.json



59
60
61
62
63
64
65
66
67
68
69
70
71
72
# File 'app/controllers/quick_dry/quick_dry_controller.rb', line 59

def create
  @instance = get_model.new(instance_params)

  respond_to do |format|
    if @instance.save
      flash[:notice] = "#{get_model.name} was successfully created."
      format.html { render 'quick_dry/show' }
      format.json { render json:@instance, status: :created, location: get_url }
    else
      format.html { render 'quick_dry/new' }
      format.json { render json:@instance.errors, status: :unprocessable_entity }
    end
  end
end

#default_serializer_optionsObject



225
226
227
228
229
230
# File 'app/controllers/quick_dry/quick_dry_controller.rb', line 225

def default_serializer_options
  {
    root: get_model.model_name.route_key#,
    # model_class: get_model
  }
end

#destroyObject

DELETE /table_name/1 DELETE /table_name/1.json



99
100
101
102
103
104
105
# File 'app/controllers/quick_dry/quick_dry_controller.rb', line 99

def destroy
  get_model.destroy(params[:id])
  respond_to do |format|
    format.html { redirect_to "/#{get_model.model_name.route_key}", notice: "#{get_model.name} was successfully destroyed." }
    format.json { head :no_content }
  end
end

#editObject

GET /table_name/1/edit



75
76
77
78
# File 'app/controllers/quick_dry/quick_dry_controller.rb', line 75

def edit
  @instance = get_model.find(params[:id])
  render 'quick_dry/edit'
end

#get_modelObject

this will only work in conjunction with the routing provided with the engine



170
171
172
173
# File 'app/controllers/quick_dry/quick_dry_controller.rb', line 170

def get_model
  model = request.params[:table_name].classify.constantize unless request.params[:table_name].blank?
  # model.blank? ? return nil : return model
end

#get_paged_search_results(params, user: nil, model: nil) ⇒ Object

Assumes the existance of a User model



176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
# File 'app/controllers/quick_dry/quick_dry_controller.rb', line 176

def get_paged_search_results(params,user:nil,model:nil)
  params[:per_page] = 10 if params[:per_page].blank?
  params[:page] = 1 if params[:page].blank?
  # a ghetto user check, but for some reason a devise user is not a devise user...
  user = User.new if user.blank? or !user.class.to_s == User.to_s

  # get the model in question
  # there has got to be a better way to do this... I just can't find it
  # model = params[:controller].blank? ? self.class.name.gsub('Controller','').singularize.constantize : params[:controller].classify.constantize
  if model.blank? 
    model = request.params[:table_name].classify.constantize unless request.params[:table_name].blank?
    return nil if model.blank?
  end

  # initialize un-paged filtered result set
  result_set = model.none

  # create where clauses to filter result to just the customers the current user has access to
  customer_filter = ""
  user.customers.each do |cust|
    if model.column_names.include? "cust_id"
      customer_filter << "(cust_id = '#{cust.cust_id(true)}') OR " unless cust.cust_id.blank?
    elsif model.attribute_alias? "cust_id"
      customer_filter << "(#{model.attribute_alias "cust_id"} = '#{cust.cust_id(true)}') OR " unless cust.cust_id.blank?
    elsif model.column_names.include? "order_number"
      customer_filter << "(order_number like '#{cust.prefix}%') OR " unless cust.prefix.blank?
    elsif model.attribute_alias? "order_number"
      customer_filter << "(#{model.attribute_alias "order_number"} like '#{cust.prefix}%') OR " unless cust.prefix.blank?
    end
  end
  customer_filter << " (1=0)"

  # create where clauses for each search parameter
  if params[:columns].blank?
    result_set = model.where(customer_filter)
  else
    where_clause = ""
    params[:columns].each do |name, value|
      where_clause << "(#{model.table_name}.#{name} like '%#{value}%') AND " unless value.blank?
    end
    where_clause << " (1=1)"

    result_set = model.where(customer_filter).where(where_clause)
  end

  instances = model.paginate(page: params[:page], per_page: params[:per_page]).merge(result_set).order(updated_at: :desc)
  return {instances:instances,params:params}
end

#get_url(target: @instance) ⇒ Object



107
108
109
110
111
112
# File 'app/controllers/quick_dry/quick_dry_controller.rb', line 107

def get_url target:@instance
  target_url = "/unknown_route"
  return target_url = "#{get_model.model_name.route_key}" if target.is_a? ActiveRecord::Relation
  return target_url = "#{get_model.model_name.route_key}/#{target.id}" if target.is_a? ActiveRecord::Base
  return target_url
end

#indexObject

GET /table_name GET /table_name.json



28
29
30
31
32
33
34
35
36
37
38
# File 'app/controllers/quick_dry/quick_dry_controller.rb', line 28

def index
  # results = get_paged_search_results(params,user:current_user)
  # params = results[:params]
  @instances = get_model.all
  # render 'quick_dry/index'
  respond_to do |format|
    # format.json { render body:@instances.to_json, content_type:'application/json'} # using the json parameter nests objects inside of quick_dry keys
    format.json { render json:serialize(@instances)}#, each_serializer: QuickDrySerializer}# serializer:QuickDryArraySerializer}
    format.html { render 'quick_dry/index'}
  end
end

#instance_paramsObject

Never trust parameters from the scary internet, only allow the white list through.



115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
# File 'app/controllers/quick_dry/quick_dry_controller.rb', line 115

def instance_params
  model = get_model
  # get all params except for id, and the standard dates
  respond_to do |format|
    format.html {  }
    format.json do
      body = JSON.parse(request.body.read)
      if body.is_a? Hash
        pascal = model.model_name.singular_route_key.camelize
        camel = model.model_name.singular_route_key.camelize(:lower)
        snake = model.model_name.singular_route_key
        # instance_name 
        if body.has_key? snake
          params.merge!(body)
        # instanceName
        elsif body.has_key? camel
          params.merge!({snake => body[camel]})
        # InstanceName
        elsif body.has_key? pascal
          params.merge!({snake => body[pascal]})
        else
          params[model.model_name.singular_route_key] = body
        end
      end
    end
  end
  return params.require(model.model_name.singular_route_key.to_sym).permit(model.attribute_names.collect{|x| x.to_sym} - [:id,:created_at,:updated_at])
end

#instantiate_pathsObject



162
163
164
165
166
167
# File 'app/controllers/quick_dry/quick_dry_controller.rb', line 162

def instantiate_paths
  route = eval %(lambda {resources :#{get_model.model_name.route_key}, controller: 'quick_dry'})
  append_route proc:route
  # append_route {resources get_model.model_name.route_key.to_sym, path: 'quick_dry'}
  # routes= Rails.application.routes.routes.map { |route| {alias: route.name, path: route.path.spec.to_s, method: "#{route.defaults[:controller]}##{route.defaults[:action]}"}}
end

#newObject

GET /table_name/new



41
42
43
44
# File 'app/controllers/quick_dry/quick_dry_controller.rb', line 41

def new
  @instance = get_model.new
  render 'quick_dry/new'
end

#serialize(stuff) ⇒ Object

nasty hack until I can get an answer on the official way to remove the instance root keys in a list



10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# File 'app/controllers/quick_dry/quick_dry_controller.rb', line 10

def serialize stuff
  if stuff.is_a? Array or stuff.is_a? ActiveRecord::Relation
    json = render_to_string json:QuickDryArraySerializer.new(stuff, root:get_model.model_name.route_key )
    hash = JSON.parse(json)
    temp = []
    if hash[get_model.model_name.route_key].first.has_key? get_model.model_name.route_key
      hash[get_model.model_name.route_key].each{|x| temp << x[get_model.model_name.route_key]}
      hash[get_model.model_name.route_key] = temp
      return hash.to_json
    end
    return json
  elsif stuff.is_a? get_model

  end
end

#showObject

GET /table_name/1 GET /table_name/1.json



48
49
50
51
52
53
54
55
# File 'app/controllers/quick_dry/quick_dry_controller.rb', line 48

def show
  @instance = get_model.find(params[:id])

  respond_to do |format|
    format.json { render json:@instance}
    format.html { render 'quick_dry/show'}
  end
end

#updateObject

PATCH/PUT /table_name/1 PATCH/PUT /table_name/1.json



82
83
84
85
86
87
88
89
90
91
92
93
94
95
# File 'app/controllers/quick_dry/quick_dry_controller.rb', line 82

def update
  @instance = get_model.find(params[:id])

  respond_to do |format|
    if @instance.update(instance_params)
      flash[:notice] = "#{get_model.name} was successfully updated."
      format.html { render 'quick_dry/show' }
      format.json { render json:@instance, status: :ok, location: get_url}
    else
      format.html { render 'quick_dry/edit' }
      format.json { render json: @instance.errors, status: :unprocessable_entity}
    end
  end
end