rails3-amf - метод to_amf не найден в объектах ActiveRecord - PullRequest
0 голосов
/ 14 апреля 2011

Я использую 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 - Спасибо за помощь.

1 Ответ

0 голосов
/ 15 апреля 2011

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

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

...