X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/654d8fe3decc93b8eb986313cdb9070f22abdca6..b9d2799dfebae724dda3b3e28641116ca5daf5c7:/apps/workbench/app/controllers/application_controller.rb?ds=sidebyside diff --git a/apps/workbench/app/controllers/application_controller.rb b/apps/workbench/app/controllers/application_controller.rb index 9f0e40aeea..f68250ba15 100644 --- a/apps/workbench/app/controllers/application_controller.rb +++ b/apps/workbench/app/controllers/application_controller.rb @@ -526,16 +526,17 @@ class ApplicationController < ActionController::Base begin if not model_class @object = nil + elsif params[:uuid].nil? or params[:uuid].empty? + @object = nil elsif not params[:uuid].is_a?(String) @object = model_class.where(uuid: params[:uuid]).first - elsif params[:uuid].empty? - @object = nil elsif (model_class != Link and resource_class_for_uuid(params[:uuid]) == Link) @name_link = Link.find(params[:uuid]) @object = model_class.find(@name_link.head_uuid) else @object = model_class.find(params[:uuid]) + load_preloaded_objects [@object] end rescue ArvadosApiClient::NotFoundException, ArvadosApiClient::NotLoggedInException, RuntimeError => error if error.is_a?(RuntimeError) and (error.message !~ /^argument to find\(/) @@ -1180,15 +1181,15 @@ class ApplicationController < ActionController::Base # helper method to get object of a given dataclass and uuid helper_method :object_for_dataclass - def object_for_dataclass dataclass, uuid, by_name=nil + def object_for_dataclass dataclass, uuid, by_attr=nil raise ArgumentError, 'No input argument dataclass' unless (dataclass && uuid) - preload_objects_for_dataclass(dataclass, [uuid], by_name) + preload_objects_for_dataclass(dataclass, [uuid], by_attr) @objects_for[uuid] end # helper method to preload objects for given dataclass and uuids helper_method :preload_objects_for_dataclass - def preload_objects_for_dataclass dataclass, uuids, by_name=nil + def preload_objects_for_dataclass dataclass, uuids, by_attr=nil @objects_for ||= {} raise ArgumentError, 'Argument is not a data class' unless dataclass.is_a? Class @@ -1205,7 +1206,9 @@ class ApplicationController < ActionController::Base uuids.each do |x| @objects_for[x] = nil end - if by_name + if by_attr and ![:uuid, :name].include?(by_attr) + raise ArgumentError, "Preloading only using lookups by uuid or name are supported: #{by_attr}" + elsif by_attr and by_attr == :name dataclass.where(name: uuids).each do |obj| @objects_for[obj.name] = obj end @@ -1217,6 +1220,15 @@ class ApplicationController < ActionController::Base @objects_for end + # helper method to load objects that are already preloaded + helper_method :load_preloaded_objects + def load_preloaded_objects objs + @objects_for ||= {} + objs.each do |obj| + @objects_for[obj.uuid] = obj + end + end + def wiselinks_layout 'body' end