Forum: Ruby on Rails ActiveRecord model classes not allowed in :expects

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Dirk B. (Guest)
on 2006-01-05 19:26
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
Dirk B. (Guest)
on 2006-01-05 19:40
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
James (Guest)
on 2006-01-14 01:28
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...
Guest (Guest)
on 2006-01-27 00:45
> 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
removed_email_address@domain.invalid
This topic is locked and can not be replied to.