Класс на основе ActiveModel не создает те же результаты, что и эквивалент ActiveRecord - PullRequest
1 голос
/ 25 октября 2010

Я занимаюсь разработкой приложения на Rails 3 с большими объемами работы с таблицами. Я использую savon_model и ActiveModel для генерации поведения, аналогичного ActiveRecord эквивалентам. Ниже мой код:

class TestClass
  include Savon::Model
  include ActiveModel::Validations

  # Configuration
  endpoint "http://localhost:8080/app/TestService"
  namespace "http://wsns.test.com/"

  actions :getObjectById, :getAllObjects

  attr_accessor :id, :name

  def initialize(hash)
    @id = hash[:id]
    @name = hash[:name]
  end

  client do
    http.headers["Pragma"] = "no-cache"
  end

  def self.all
    h = getAllObjects(nil).to_array
    return convert_array_hash_to_obj(h, :get_all_objects_response)
  end

  def self.find(id)
    h = getObjectById(:arg0 => id).to_hash
    return convert_hash_to_obj(h, :get_object_by_id_response)
  end

private

  def self.convert_array_hash_to_obj(arrayhash, returnlabel)
    results = Array.new

    arrayhash.each do |hash|
      results << convert_hash_to_obj(hash, returnlabel)
    end

    return results

  end

  def self.convert_hash_to_obj(hash, returnlabel)
    return TestClass.new(hash[returnlabel][:return])
  end

end

ОК, все работает как положено; значения извлекаются из веб-службы и на страницу. К сожалению, когда я смотрю на HTML, созданный на стороне клиента, возникают некоторые проблемы. Ссылки Показать по следующим линиям:

/testclasses/%23%3CTestClass:0xa814cb4%3E

вместо ...

/testclasses/1

Итак, я сделал вывод объекта (хеш?) На консоль, чтобы сравнить выходные данные.

[#<System:0xa814cb4 @id="1", @name="CIS">]

вместо того, что я считаю, должно быть ...

[#<System id="1", name="CIS">]

У меня три вопроса:
1: Что такое шестнадцатеричный суффикс в имени моего класса, когда он распечатывается
2: Как я могу изменить свой класс, чтобы он соответствовал желаемому выводу при выводе на консоль?
3: Почему ссылки внешнего интерфейса (Показать, Изменить, Удалить) не работают и есть ли простое исправление?

Большое спасибо за ваше время и извинения за мусорный код / ​​глупые вопросы. Это мое первое приложение на Ruby или Rails!

Gareth

1 Ответ

0 голосов
/ 07 сентября 2012
  1. Шестнадцатеричный суффикс - это идентификатор объекта вашего экземпляра System
  2. Вы можете манипулировать выводом на консоли, реализовав inspect метод экземпляра
  3. Помощники Rails по URL используют метод экземпляра to_param для создания этих ссылок. Вам следует реализовать это, если вы собираетесь использовать свой класс в качестве замены ActiveRecord.

В общем, если вы хотите использовать все вкусности Rails с собственной реализацией класса модели, вы должны использовать ActiveModel:Lint::Test, чтобы проверить, какие части API ActiveModel работают должным образом.

Более подробную информацию можно найти здесь: http://api.rubyonrails.org/classes/ActiveModel/Lint/Tests.html

...