Module | ActionWebService::Scaffolding::ClassMethods |
In: |
vendor/rails/actionwebservice/lib/action_web_service/scaffolding.rb
|
Web service invocation scaffolding provides a way to quickly invoke web service methods in a controller. The generated scaffold actions have default views to let you enter the method parameters and view the results.
Example:
class ApiController < ActionController web_service_scaffold :invoke end
This example generates an invoke action in the ApiController that you can navigate to from your browser, select the API method, enter its parameters, and perform the invocation.
If you want to customize the default views, create the following views in "app/views":
Where action_name is the name of the action you gave to ClassMethods#web_service_scaffold.
You can use the default views in RAILS_DIR/lib/action_web_service/templates/scaffolds as a guide.
Generates web service invocation scaffolding for the current controller. The given action name can then be used as the entry point for invoking API methods from a web browser.
# File vendor/rails/actionwebservice/lib/action_web_service/scaffolding.rb, line 40 40: def web_service_scaffold(action_name) 41: add_template_helper(Helpers) 42: module_eval "def \#{action_name}\nif request.method == :get\nsetup_invocation_assigns\nrender_invocation_scaffold 'methods'\nend\nend\n\ndef \#{action_name}_method_params\nif request.method == :get\nsetup_invocation_assigns\nrender_invocation_scaffold 'parameters'\nend\nend\n\ndef \#{action_name}_submit\nif request.method == :post\nsetup_invocation_assigns\nprotocol_name = params['protocol'] ? params['protocol'].to_sym : :soap\ncase protocol_name\nwhen :soap\n@protocol = Protocol::Soap::SoapProtocol.create(self)\nwhen :xmlrpc\n@protocol = Protocol::XmlRpc::XmlRpcProtocol.create(self)\nend\nbm = Benchmark.measure do\n@protocol.register_api(@scaffold_service.api)\npost_params = params['method_params'] ? params['method_params'].dup : nil\nparams = []\n@scaffold_method.expects.each_with_index do |spec, i|\nparams << post_params[i.to_s]\nend if @scaffold_method.expects\nparams = @scaffold_method.cast_expects(params)\nmethod_name = public_method_name(@scaffold_service.name, @scaffold_method.public_name)\n@method_request_xml = @protocol.encode_request(method_name, params, @scaffold_method.expects)\nnew_request = @protocol.encode_action_pack_request(@scaffold_service.name, @scaffold_method.public_name, @method_request_xml)\nprepare_request(new_request, @scaffold_service.name, @scaffold_method.public_name)\nself.request = new_request\nif @scaffold_container.dispatching_mode != :direct\nrequest.parameters['action'] = @scaffold_service.name\nend\ndispatch_web_service_request\n@method_response_xml = response.body\nmethod_name, obj = @protocol.decode_response(@method_response_xml)\nreturn if handle_invocation_exception(obj)\n@method_return_value = @scaffold_method.cast_returns(obj)\nend\n@method_elapsed = bm.real\nadd_instance_variables_to_assigns\nreset_invocation_response\nrender_invocation_scaffold 'result'\nend\nend\n\nprivate\ndef setup_invocation_assigns\n@scaffold_class = self.class\n@scaffold_action_name = \"\#{action_name}\"\n@scaffold_container = WebServiceModel::Container.new(self)\nif params['service'] && params['method']\n@scaffold_service = @scaffold_container.services.find{ |x| x.name == params['service'] }\n@scaffold_method = @scaffold_service.api_methods[params['method']]\nend\nadd_instance_variables_to_assigns\nend\n\ndef render_invocation_scaffold(action)\ncustomized_template = \"\\\#{self.class.controller_path}/\#{action_name}/\\\#{action}\"\ndefault_template = scaffold_path(action)\nif template_exists?(customized_template)\ncontent = @template.render_file(customized_template)\nelse\ncontent = @template.render_file(default_template, false)\nend\n@template.instance_variable_set(\"@content_for_layout\", content)\nif self.active_layout.nil?\nrender_file(scaffold_path(\"layout\"))\nelse\nrender_file(self.active_layout, \"200 OK\", true)\nend\nend\n\ndef scaffold_path(template_name)\nFile.dirname(__FILE__) + \"/templates/scaffolds/\" + template_name + \".rhtml\"\nend\n\ndef reset_invocation_response\nerase_render_results\nresponse.headers = ::ActionController::AbstractResponse::DEFAULT_HEADERS.merge(\"cookie\" => [])\nend\n\ndef public_method_name(service_name, method_name)\nif web_service_dispatching_mode == :layered && @protocol.is_a?(ActionWebService::Protocol::XmlRpc::XmlRpcProtocol)\nservice_name + '.' + method_name\nelse\nmethod_name\nend\nend\n\ndef prepare_request(new_request, service_name, method_name)\nnew_request.parameters.update(request.parameters)\nrequest.env.each{ |k, v| new_request.env[k] = v unless new_request.env.has_key?(k) }\nif web_service_dispatching_mode == :layered && @protocol.is_a?(ActionWebService::Protocol::Soap::SoapProtocol)\nnew_request.env['HTTP_SOAPACTION'] = \"/\\\#{controller_name()}/\\\#{service_name}/\\\#{method_name}\"\nend\nend\n\ndef handle_invocation_exception(obj)\nexception = nil\nif obj.respond_to?(:detail) && obj.detail.respond_to?(:cause) && obj.detail.cause.is_a?(Exception)\nexception = obj.detail.cause\nelsif obj.is_a?(XMLRPC::FaultException)\nexception = obj\nend\nreturn unless exception\nreset_invocation_response\nrescue_action(exception)\ntrue\nend\n", __FILE__, __LINE__ + 1 43: end