Make ActiveWebService::Struct type reloadable. Fix scaffolding action when one of the members of a structural type has date or time type. Remove extra index hash when generating scaffold html for parameters of structural type (closes #4374) [joe@mjg2.com]
git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@4054 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
This commit is contained in:
parent
77c8e3a0fd
commit
c4f1979db5
@ -1,5 +1,11 @@
|
||||
*SVN*
|
||||
|
||||
* Make ActiveWebService::Struct type reloadable
|
||||
|
||||
* Fix scaffolding action when one of the members of a structural type has date or time type
|
||||
|
||||
* Remove extra index hash when generating scaffold html for parameters of structural type #4374 [joe@mjg2.com]
|
||||
|
||||
* Fix Scaffold Fails with Struct as a Parameter #4363 [joe@mjg2.com]
|
||||
|
||||
* Fix soap type registration of multidimensional arrays (#4232)
|
||||
|
@ -96,10 +96,13 @@ def cast_base_type(value, signature_type) # :nodoc:
|
||||
when :float
|
||||
Float(value)
|
||||
when :time
|
||||
value = "#{value['2']}/#{value['3']}/#{value['1']} #{value['4']}:#{value['5']}:#{value['6']}" if value.kind_of?(Hash)
|
||||
Time.parse(value.to_s)
|
||||
when :date
|
||||
value = "#{value['2']}/#{value['3']}/#{value['1']}" if value.kind_of?(Hash)
|
||||
Date.parse(value.to_s)
|
||||
when :datetime
|
||||
value = "#{value['2']}/#{value['3']}/#{value['1']} #{value['4']}:#{value['5']}:#{value['6']}" if value.kind_of?(Hash)
|
||||
DateTime.parse(value.to_s)
|
||||
end
|
||||
end
|
||||
|
@ -69,21 +69,9 @@ def #{action_name}_submit
|
||||
@protocol.register_api(@scaffold_service.api)
|
||||
post_params = params['method_params'] ? params['method_params'].dup : nil
|
||||
params = []
|
||||
if @scaffold_method.expects
|
||||
@scaffold_method.expects.each_with_index do |spec, i|
|
||||
case spec.type
|
||||
when :date
|
||||
date = post_params[i.to_s]
|
||||
params << (date['2'] + '/' + date['3'] + '/' + date['1'])
|
||||
when :datetime, :time
|
||||
date = post_params[i.to_s]
|
||||
params << (date['2'] + '/' + date['3'] + '/' + date['1'] + ' ' +
|
||||
date['4'] + ':' + date['5'] + ':' + date['6'])
|
||||
else
|
||||
params << post_params[i.to_s]
|
||||
end
|
||||
end
|
||||
end
|
||||
@scaffold_method.expects.each_with_index do |spec, i|
|
||||
params << post_params[i.to_s]
|
||||
end if @scaffold_method.expects
|
||||
params = @scaffold_method.cast_expects(params)
|
||||
method_name = public_method_name(@scaffold_service.name, @scaffold_method.public_name)
|
||||
@method_request_xml = @protocol.encode_request(method_name, params, @scaffold_method.expects)
|
||||
@ -176,11 +164,12 @@ def handle_invocation_exception(obj)
|
||||
end
|
||||
|
||||
module Helpers # :nodoc:
|
||||
def method_parameter_input_fields(method, type, field_name_base, idx)
|
||||
def method_parameter_input_fields(method, type, field_name_base, idx, was_structured=false)
|
||||
if type.array?
|
||||
return content_tag('em', "Typed array input fields not supported yet (#{type.name})")
|
||||
end
|
||||
if type.structured?
|
||||
return content_tag('em', "Nested structural types not supported yet (#{type.name})") if was_structured
|
||||
parameters = ""
|
||||
type.each_member do |member_name, member_type|
|
||||
label = method_parameter_label(member_name, member_type)
|
||||
@ -188,7 +177,8 @@ def method_parameter_input_fields(method, type, field_name_base, idx)
|
||||
method,
|
||||
member_type,
|
||||
"#{field_name_base}[#{idx}][#{member_name}]",
|
||||
idx)
|
||||
idx,
|
||||
true)
|
||||
if member_type.custom?
|
||||
parameters << content_tag('li', label)
|
||||
parameters << content_tag('ul', nested_content)
|
||||
@ -198,31 +188,34 @@ def method_parameter_input_fields(method, type, field_name_base, idx)
|
||||
end
|
||||
content_tag('ul', parameters)
|
||||
else
|
||||
# If the data source was structured previously we already have the index set
|
||||
field_name_base = "#{field_name_base}[#{idx}]" unless was_structured
|
||||
|
||||
case type.type
|
||||
when :int
|
||||
text_field_tag "#{field_name_base}[#{idx}]"
|
||||
text_field_tag "#{field_name_base}"
|
||||
when :string
|
||||
text_field_tag "#{field_name_base}[#{idx}]"
|
||||
text_field_tag "#{field_name_base}"
|
||||
when :base64
|
||||
text_area_tag "#{field_name_base}[#{idx}]", nil, :size => "40x5"
|
||||
text_area_tag "#{field_name_base}", nil, :size => "40x5"
|
||||
when :bool
|
||||
radio_button_tag("#{field_name_base}[#{idx}]", "true") + " True" +
|
||||
radio_button_tag("#{field_name_base}[#{idx}]", "false") + "False"
|
||||
radio_button_tag("#{field_name_base}", "true") + " True" +
|
||||
radio_button_tag("#{field_name_base}", "false") + "False"
|
||||
when :float
|
||||
text_field_tag "#{field_name_base}[#{idx}]"
|
||||
text_field_tag "#{field_name_base}"
|
||||
when :time, :datetime
|
||||
time = Time.now
|
||||
i = 0
|
||||
%w|year month day hour minute second|.map do |name|
|
||||
i += 1
|
||||
send("select_#{name}", time, :prefix => "#{field_name_base}[#{idx}][#{i}]", :discard_type => true)
|
||||
send("select_#{name}", time, :prefix => "#{field_name_base}[#{i}]", :discard_type => true)
|
||||
end.join
|
||||
when :date
|
||||
date = Date.today
|
||||
i = 0
|
||||
%w|year month day|.map do |name|
|
||||
i += 1
|
||||
send("select_#{name}", date, :prefix => "#{field_name_base}[#{idx}][#{i}]", :discard_type => true)
|
||||
send("select_#{name}", date, :prefix => "#{field_name_base}[#{i}]", :discard_type => true)
|
||||
end.join
|
||||
end
|
||||
end
|
||||
|
@ -19,6 +19,9 @@ module ActionWebService
|
||||
# Active Record model classes are already implicitly supported in method
|
||||
# signatures.
|
||||
class Struct
|
||||
# Action WebService Struct subclasses should be reloaded by the dispatcher in Rails
|
||||
# when Dependencies.mechanism = :load.
|
||||
include Reloadable::Subclasses
|
||||
|
||||
# If a Hash is given as argument to an ActionWebService::Struct constructor,
|
||||
# it can contain initial values for the structure member.
|
||||
|
@ -8,8 +8,9 @@
|
||||
ActionController::Base.template_root = '.'
|
||||
|
||||
class ScaffoldPerson < ActionWebService::Struct
|
||||
member :id, :int
|
||||
member :name, :string
|
||||
member :id, :int
|
||||
member :name, :string
|
||||
member :birth, :date
|
||||
|
||||
def ==(other)
|
||||
self.id == other.id && self.name == other.name
|
||||
@ -19,6 +20,7 @@ def ==(other)
|
||||
class ScaffoldedControllerTestAPI < ActionWebService::API::Base
|
||||
api_method :hello, :expects => [{:integer=>:int}, :string], :returns => [:bool]
|
||||
api_method :hello_struct_param, :expects => [{:person => ScaffoldPerson}], :returns => [:bool]
|
||||
api_method :date_of_birth, :expects => [ScaffoldPerson], :returns => [:string]
|
||||
api_method :bye, :returns => [[ScaffoldPerson]]
|
||||
api_method :date_diff, :expects => [{:start_date => :date}, {:end_date => :date}], :returns => [:int]
|
||||
api_method :time_diff, :expects => [{:start_time => :time}, {:end_time => :time}], :returns => [:int]
|
||||
@ -36,6 +38,10 @@ def hello(int, string)
|
||||
def hello_struct_param(person)
|
||||
0
|
||||
end
|
||||
|
||||
def date_of_birth(person)
|
||||
person.birth.to_s
|
||||
end
|
||||
|
||||
def bye
|
||||
[ScaffoldPerson.new(:id => 1, :name => "leon"), ScaffoldPerson.new(:id => 2, :name => "paul")]
|
||||
@ -78,6 +84,7 @@ def test_scaffold_invoke_method_params
|
||||
def test_scaffold_invoke_method_params_with_struct
|
||||
get :scaffold_invoke_method_params, :service => 'scaffolded', :method => 'HelloStructParam'
|
||||
assert_rendered_file 'parameters.rhtml'
|
||||
assert_tag :tag => 'input', :attributes => {:name => "method_params[0][name]"}
|
||||
end
|
||||
|
||||
def test_scaffold_invoke_submit_hello
|
||||
@ -106,6 +113,12 @@ def test_scaffold_date_params
|
||||
:method_params => {'0' => {'1' => '2006', '2' => '2', '3' => '1'}, '1' => {'1' => '2006', '2' => '2', '3' => '2'}}
|
||||
assert_equal 1, @controller.instance_eval{ @method_return_value }
|
||||
end
|
||||
|
||||
def test_scaffold_struct_date_params
|
||||
post :scaffold_invoke_submit, :service => 'scaffolded', :method => 'DateOfBirth',
|
||||
:method_params => {'0' => {'birth' => {'1' => '2006', '2' => '2', '3' => '1'}, 'id' => '1', 'name' => 'person'}}
|
||||
assert_equal '2006-02-01', @controller.instance_eval{ @method_return_value }
|
||||
end
|
||||
|
||||
def test_scaffold_time_params
|
||||
get :scaffold_invoke_method_params, :service => 'scaffolded', :method => 'TimeDiff'
|
||||
|
Loading…
Reference in New Issue
Block a user