#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?