Class: ActionDispatch::Routing::PolymorphicRoutes::HelperMethodBuilder

Inherits:
Object
  • Object
show all
Defined in:
lib/action_dispatch/routing/polymorphic_routes.rb

Overview

:nodoc:

Constant Summary collapse

CACHE =
{ path: {}, url: {} }

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(key_strategy, prefix, suffix) ⇒ HelperMethodBuilder

Returns a new instance of HelperMethodBuilder.



239
240
241
242
243
# File 'lib/action_dispatch/routing/polymorphic_routes.rb', line 239

def initialize(key_strategy, prefix, suffix)
  @key_strategy = key_strategy
  @prefix       = prefix
  @suffix       = suffix
end

Instance Attribute Details

#prefixObject (readonly)

Returns the value of attribute prefix.



237
238
239
# File 'lib/action_dispatch/routing/polymorphic_routes.rb', line 237

def prefix
  @prefix
end

#suffixObject (readonly)

Returns the value of attribute suffix.



237
238
239
# File 'lib/action_dispatch/routing/polymorphic_routes.rb', line 237

def suffix
  @suffix
end

Class Method Details

.build(action, type) ⇒ Object



187
188
189
190
191
192
193
194
195
# File 'lib/action_dispatch/routing/polymorphic_routes.rb', line 187

def self.build(action, type)
  prefix = action ? "#{action}_" : ""
  suffix = type
  if action.to_s == "new"
    HelperMethodBuilder.singular prefix, suffix
  else
    HelperMethodBuilder.plural prefix, suffix
  end
end

.get(action, type) ⇒ Object



179
180
181
182
# File 'lib/action_dispatch/routing/polymorphic_routes.rb', line 179

def self.get(action, type)
  type = type.to_sym
  CACHE[type].fetch(action) { build action, type }
end

.pathObject



185
# File 'lib/action_dispatch/routing/polymorphic_routes.rb', line 185

def self.path; CACHE[:path][nil]; end

.plural(prefix, suffix) ⇒ Object



201
202
203
# File 'lib/action_dispatch/routing/polymorphic_routes.rb', line 201

def self.plural(prefix, suffix)
  new(->(name) { name.route_key }, prefix, suffix)
end

.polymorphic_method(recipient, record_or_hash_or_array, action, type, options) ⇒ Object



205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
# File 'lib/action_dispatch/routing/polymorphic_routes.rb', line 205

def self.polymorphic_method(recipient, record_or_hash_or_array, action, type, options)
  builder = get action, type

  case record_or_hash_or_array
  when Array
    record_or_hash_or_array = record_or_hash_or_array.compact
    if record_or_hash_or_array.empty?
      raise ArgumentError, "Nil location provided. Can't build URI."
    end
    if record_or_hash_or_array.first.is_a?(ActionDispatch::Routing::RoutesProxy)
      recipient = record_or_hash_or_array.shift
    end

    method, args = builder.handle_list record_or_hash_or_array
  when String, Symbol
    method, args = builder.handle_string record_or_hash_or_array
  when Class
    method, args = builder.handle_class record_or_hash_or_array

  when nil
    raise ArgumentError, "Nil location provided. Can't build URI."
  else
    method, args = builder.handle_model record_or_hash_or_array
  end

  if options.empty?
    recipient.public_send(method, *args)
  else
    recipient.public_send(method, *args, options)
  end
end

.singular(prefix, suffix) ⇒ Object



197
198
199
# File 'lib/action_dispatch/routing/polymorphic_routes.rb', line 197

def self.singular(prefix, suffix)
  new(->(name) { name.singular_route_key }, prefix, suffix)
end

.urlObject



184
# File 'lib/action_dispatch/routing/polymorphic_routes.rb', line 184

def self.url;  CACHE[:url][nil]; end

Instance Method Details

#handle_class(klass) ⇒ Object



253
254
255
# File 'lib/action_dispatch/routing/polymorphic_routes.rb', line 253

def handle_class(klass)
  [get_method_for_class(klass), []]
end

#handle_class_call(target, klass) ⇒ Object



257
258
259
# File 'lib/action_dispatch/routing/polymorphic_routes.rb', line 257

def handle_class_call(target, klass)
  target.public_send get_method_for_class klass
end

#handle_list(list) ⇒ Object



284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
# File 'lib/action_dispatch/routing/polymorphic_routes.rb', line 284

def handle_list(list)
  record_list = list.dup
  record      = record_list.pop

  args = []

  route = record_list.map do |parent|
    case parent
    when Symbol
      parent.to_s
    when String
      raise(ArgumentError, "Please use symbols for polymorphic route arguments.")
    when Class
      args << parent
      parent.model_name.singular_route_key
    else
      args << parent.to_model
      parent.to_model.model_name.singular_route_key
    end
  end

  route <<
  case record
  when Symbol
    record.to_s
  when String
    raise(ArgumentError, "Please use symbols for polymorphic route arguments.")
  when Class
    @key_strategy.call record.model_name
  else
    model = record.to_model
    if model.persisted?
      args << model
      model.model_name.singular_route_key
    else
      @key_strategy.call model.model_name
    end
  end

  route << suffix

  named_route = prefix + route.join("_")
  [named_route, args]
end

#handle_model(record) ⇒ Object



261
262
263
264
265
266
267
268
269
270
271
272
273
# File 'lib/action_dispatch/routing/polymorphic_routes.rb', line 261

def handle_model(record)
  args  = []

  model = record.to_model
  named_route = if model.persisted?
    args << model
    get_method_for_string model.model_name.singular_route_key
  else
    get_method_for_class model
  end

  [named_route, args]
end

#handle_model_call(target, record) ⇒ Object



275
276
277
278
279
280
281
282
# File 'lib/action_dispatch/routing/polymorphic_routes.rb', line 275

def handle_model_call(target, record)
  if mapping = polymorphic_mapping(target, record)
    mapping.call(target, [record], suffix == "path")
  else
    method, args = handle_model(record)
    target.public_send(method, *args)
  end
end

#handle_string(record) ⇒ Object



245
246
247
# File 'lib/action_dispatch/routing/polymorphic_routes.rb', line 245

def handle_string(record)
  [get_method_for_string(record), []]
end

#handle_string_call(target, str) ⇒ Object



249
250
251
# File 'lib/action_dispatch/routing/polymorphic_routes.rb', line 249

def handle_string_call(target, str)
  target.public_send get_method_for_string str
end