Я использую gem rails3-amf от warhammerkid в моем проекте Rails 3 / Flex 4.
AFAIK, я правильно следовал инструкциям "Getting Started" со страницы GitHub.
- Я добавил линии драгоценных камней в свой 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
Обратите внимание, что толькоActiveModel::Serialization
есть.Нет упоминания о Rails3AMF
.
Значит ли это, что я должен сделать что-то особенное, чтобы загрузить модуль Rails3AMF для моделей ActiveRecord?
Я использую Rails 3.0.5 с последней версией ree.Все драгоценные камни содержатся в наборе драгоценных камней, управляемом с помощью 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
Почему это не работает?Должен ли я принудительно загрузить гем при инициализации моего приложения или что-то в этом роде?
Спасибо!
Обновление 4 - решено с помощью этого обходного пути
Хорошо, я только что добавил этот кодблок в инициализаторе:
class ActiveRecord::Base
include Rails3AMF::Serialization
end
И он работает.
@ warhammerkid - Спасибо за помощь.