метод rails3-amf — to_amf не найден для объектов ActiveRecord

#ruby-on-rails-3 #flex4 #amf

#ruby-on-rails-3 #flex4 #amf

Вопрос:

Я использую драгоценный камень rails3-amf от warhammerkid в моем проекте Rails 3 / Flex 4.

AFAIK, я правильно следовал инструкциям «Начало работы» со страницы GitHub.

  • Я добавил строки gem в свой Gemfile.
  • Я установил драгоценные камни с помощью bundle install .
  • Из моего приложения Flex я буду вызывать RemoteObject для index действия в ManageMySchool::GradesController файле. Это код в app/controllers/manage_my_school/grades_controller.rb файле:
 class ManageMySchool::GradesController < ApplicationController  
    respond_to :html, :amf  

    def index
        @grade = Grade.first
        respond_with(@grade) do |format|
            format.amf { render :amf => @grade.to_amf }
        end
    end 
end
  
  • Имя модели, которая должна быть сериализована, вызывается Grade как в проекте Rails ( app/models/Grade.rb ), так и в проекте Flex ( Grade.as с RemoteAlias заданным как Grade ). В config/application.rb файле я выполнил сопоставление классов следующим образом:
 config.rails3amf.class_mapping do |m|
    m.map :as => 'Grade', :ruby => 'Grade'  
end
  
  • И я выполнил сопоставление параметров таким образом:
 config.rails3amf.map_params :controller => 'ManageMySchool::GradesController', :action => 'index', :params => [:authenticity_token]
  

Проблема

Теперь, когда я запускаю сервер и выполняю вызов RemoteObject из Flex, я получаю to_amf undefined method ошибку для Grade модели.

Если я изменю Grade.first на Grade.all , @grade будет получен массив оценок. Но в undefined method сообщении об ошибке все еще упоминается модель Grade. Это означает, что to_amf метод работает для класса Array, но не для модели ActiveRecord.

Почему это? Что я делаю не так?

Есть ли что-то, что я должен сделать, чтобы «включить» драгоценный камень rails3-amf для моделей ActiveRecord?

Я был бы признателен за любую информацию. Спасибо!

Обновить

@warhammerkid: Вот выходные данные Grade.ancestors, которые видны в консоли rails.

 ree-1.8.7-2011.03 :006 > puts Grade.ancestors
Grade
ActiveRecord::Base
Paperclip::CallbackCompatability::Rails3::Running
Paperclip::CallbackCompatability::Rails3
Paperclip::Glue CanCan::ModelAdditions
Authlogic::ActsAsAuthentic::ValidationsScope
Authlogic::ActsAsAuthentic::SingleAccessToken
Authlogic::ActsAsAuthentic::SessionMaintenance
Authlogic::ActsAsAuthentic::RestfulAuthentication::InstanceMethods
Authlogic::ActsAsAuthentic::RestfulAuthentication
Authlogic::ActsAsAuthentic::PersistenceToken
Authlogic::ActsAsAuthentic::PerishableToken
Authlogic::ActsAsAuthentic::Password
Authlogic::ActsAsAuthentic::MagicColumns
Authlogic::ActsAsAuthentic::Login
Authlogic::ActsAsAuthentic::LoggedInStatus
Authlogic::ActsAsAuthentic::Email
Authlogic::ActsAsAuthentic::Base
ActiveRecord::Aggregations
ActiveRecord::Transactions
ActiveRecord::Reflection
ActiveRecord::Serialization
ActiveModel::Serializers::Xml
ActiveModel::Serializers::JSON
ActiveModel::Serialization
ActiveRecord::AutosaveAssociation
ActiveRecord::NestedAttributes
ActiveRecord::Associations
ActiveRecord::AssociationPreload
ActiveRecord::NamedScope
ActiveModel::Validations::Callbacks
ActiveRecord::Callbacks
ActiveModel::Observing
ActiveRecord::Timestamp
ActiveModel::MassAssignmentSecurity
ActiveRecord::AttributeMethods::Dirty
ActiveModel::Dirty
ActiveRecord::AttributeMethods::TimeZoneConversion
ActiveRecord::AttributeMethods::PrimaryKey
ActiveRecord::AttributeMethods::Read
ActiveRecord::AttributeMethods::Write
ActiveRecord::AttributeMethods::BeforeTypeCast
#<Module:0x1028356f0> ActiveRecord::AttributeMethods::Query
ActiveRecord::AttributeMethods
ActiveModel::AttributeMethods
ActiveRecord::Locking::Optimistic
ActiveRecord::Locking::Pessimistic
ActiveRecord::Validations
ActiveModel::Validations::HelperMethods
ActiveModel::Validations
ActiveSupport::Callbacks
ActiveModel::Conversion
ActiveRecord::Persistence Object
PP::ObjectMixin Base64::Deprecated
Base64
ActiveSupport::Dependencies::Loadable
Kernel
  

Note that only ActiveModel::Serialization is there. No mention of Rails3AMF .

Does this mean I have to do something special to load the Rails3AMF module for the ActiveRecord models?

I am using Rails 3.0.5 with the latest version of ree. The gems are all contained in a gemset managed using rvm.

Обновление 2

Если я удаляю to_amf в render :amf строке, то я получаю следующую ошибку:

 Grade Load (0.3ms)  SELECT `grades`.* FROM `grades` LIMIT 1
Completed 200 OK in 195ms (Views: 0.1ms | ActiveRecord: 0.8ms)
Sending back AMF

NoMethodError (You have a nil object when you didn't expect it!
You might have expected an instance of Array.
The error occurred while evaluating nil.last):


Rendered /Users/anjan/.rvm/gems/ree-1.8.7-2011.03@rb/gems/actionpack-3.0.5/lib/>     >     action_dispatch/middleware/templates/rescues/_trace.erb (1.1ms)
Rendered /Users/anjan/.rvm/gems/ree-1.8.7-2011.03@rb/gems/actionpack-3.0.5/lib/>     >     action_dispatch/middleware/templates/rescues/_request_and_response.erb (2.8ms)
Rendered /Users/anjan/.rvm/gems/ree-1.8.7-2011.03@rb/gems/actionpack-3.0.5/lib/>     >     action_dispatch/middleware/templates/rescues/diagnostics.erb within rescues/layout (13.6ms)


Started POST "/amf" for 127.0.0.1 at Fri Apr 15 17:03:34  0530 2011
Sending back AMF
  

Обновление 3

Если я вручную добавлю строку include Rails3AMF::Serialization в начало Grade.rb файла модели, то все это сработает. Итак, означает ли это, что я должен поместить эту строку во все мои модели?

Я вижу, что это уже делается в строках с номерами 40-42 в lib/rails3-amf/serialization.rb файле драгоценного камня:

 # Hook into any object that includes ActiveModel::Serialization
module ActiveModel::Serialization
    include Rails3AMF::Serialization
end
  

Почему это не работает? Должен ли я принудительно загружать gem при инициализации моего приложения или что-то в этом роде?

Спасибо!

Обновление 4 — Решается этим обходным путем

Хорошо, я только что закончил с добавлением этого блока кода в инициализатор:

 class ActiveRecord::Base
    include Rails3AMF::Serialization  
end
  

И он работает.

@warhammerkid — Спасибо за помощь.

Комментарии:

1. Что возвращает Grade.ancestors? Он должен включать ActiveModel::Serialization и Rails3AMF::Serialization, если вы используете ActiveRecord и последнюю версию Rails.

2. @warhammerkid — Я включил выходные данные Grade.ancestors в исходный вопрос.

Ответ №1:

Rails3AMF::Serialization, модуль, добавляющий метод to_amf, включается в ActiveModel::Serialization при загрузке Rails3-AMF. Если он каким-то образом не включается, даже несмотря на то, что код запущен и ActiveModel::Serialization является одним из предков вашей модели, то самое простое решение — просто добавить «включить Rails3AMF::Serialization» в верхней части реализации вашей модели. Я никогда раньше не пробовал наборы драгоценных камней, но это может быть проблемой с ними, поскольку все работает корректно с использованием Bundler.

Кроме того, не стесняйтесь публиковать ошибку в https://github.com/warhammerkid/rails3-amf/issues.

Комментарии:

1. Можно ли сделать так, чтобы мы могли добавить config строку в application.rb для автоматического включения Rails3AMF::Serialization модуля во все модели ActiveRecord?