ActiveRecord model classes not allowed in :expects

Hi,

I have a strange problem while using WebService API which expects an
ActiveRecord derivate.

This is the code of the API …


class HarvesterApi < ActionWebService::API::Base
api_method :send_measurand,
:expects => [{:measurand => Measurand}, {:eaiSystemName =>
:string}]
end

… and this of my Model


class Measurand < ActiveRecord::Base

belongs_to :eai_system
belongs_to :measurement_error
acts_as_tree :order => “genId”

Constants for validation of measurand scope

CLASSIFICATION_BEAN = “Bean”
CLASSIFICATION_APPLICATION = “Application”
CLASSIFICATION_WORKFLOW = “Workflow”

Validation part

validates_presence_of :name, :genId, :classification

validates_uniqueness_of :genId,
:message => “The GenID must be unique”

validates_inclusion_of :classification,
:in => [ CLASSIFICATION_BEAN,
CLASSIFICATION_APPLICATION, CLASSIFICATION_WORKFLOW ],
:message => “Classification must be of
the following: #{CLASSIFICATION_BEAN}, #{CLASSIFICATION_APPLICATION},
#{CLASSIFICATION_WORKFLOW}”

end

When I invoke the service.wsdl URL I’m getting the error from the Topic
(Complete Error page follows):


ActiveRecord model classes not allowed in :expects

How can that be? Did I any mistakes? That would be no suprise, bacause
I’m new to Rails and Ruby. But as I understand it, it is possible to use
a AR as structured type in the method signature of a WebService.

Thanks for your help.

Dirk

By the way another WebService related question:

I want to give the Model class that should be send over the wire an
Array which can holds the children of that Model (The model has a tree
like structure). Is this possible? I found nothing about this topic
neither in the Agile Rails Book nor somewhere else.

Thanks again

Dirk

Dirk Breuer wrote:

Hi,

I have a strange problem while using WebService API which expects an
ActiveRecord derivate.

This is the code of the API …

…snip…

When I invoke the service.wsdl URL I’m getting the error from the Topic
(Complete Error page follows):

…snip…

I am seeing the same thing with Rails 1.0. I did a google search and
found this diff:

http://dev.rubyonrails.org/changeset/815?format=diff

Basically, I think they now turn it off by default due to the possible
security issues associated with anyone being able to serialize an
ActiveRecord class and (possibly) blindly saving it. It appears that
they may have a flag that can be set to allow this to occur. But,
according to the Rails book, there is a class called
ActiveWebService::Struct that can be used in its place as an expects
parameter to achieve the same thing and offer more security (page 427).
I’m trying to determine how I want my SOAP service to look, so I may
either 1) pass the fields as native types and construct the ActiveRecord
instance on the AWS controller or 2) use a Struct subclass.

Seems like a good RoR generator could be written to write the struct
from a given AR model to keep them in sync and allow the Struct to be a
more of a ‘value object’. Something to consider at least…

http://dev.rubyonrails.org/changeset/815?format=diff
Basically, I think they now turn it off by default

Even when you set

class_inheritable_option :allow_active_record_expects, true

it fails for me with

Internal protocol error: You have a nil object when you didn’t expect
it!
You might have expected an instance of Array.
The error occured while evaluating nil.include?
Backtrace:
/usr/local/lib/ruby/gems/1.8/gems/activerecord-1.13.2/lib/active_record/base.rb:1401:in
`respond_to?’

I’m not too worried about the security concerns they mention, I still
have to create a struct with the same parameters as the object. Maybe
I’m missing something about the serializition. But, this runs in a
“trusted enivorment”.

Seems like a good RoR generator could be written to write the struct
from a given AR model to keep them in sync and allow the Struct to be a
more of a ‘value object’. Something to consider at least…

This would be ok with me. I don’t like having to hand create a struct
for my classes.

And finally, if anyone has a :expects passing in a active_record object
please explain how they’re doing it. I wasted a whole day messing with
this.

Thanks,
Russ
[email protected]