Ruby === не действует, когда левый аргумент является классом - PullRequest
1 голос
/ 26 июня 2011

Я использую Ruby 1.8.7 с Rails 3.0.1, и у меня возникла проблема, основной причиной которой является операция «Array === object».Я видел такое же поведение ранее в классе своего собственного создания и программировал его, не используя оператор "===" (я предполагал, что в моих знаниях Ruby есть какой-то недостаток, который все еще довольно ограничен).Но теперь, когда это происходит внутри ActionPack, мне нужно что-то с этим поделать.

Это появилось, когда FormHelper «fields_for» действовал не так, как должен.Следующий фрагмент кода представления («<%%>» удален для улучшения читабельности):

form_for @coupon do |f|
  ...
  f.fields_for @coupon.participants do |cp|
    ...
  end
end

выдал ошибку «ActionView :: Template :: Error (неопределенный метод` имя_модели` для Array: Class):"внутри вспомогательного метода form_for.Я определил, что выполняется неправильная ветвь команды case, установил точку останова и начал тестирование.Вот результаты:

/Library/Ruby/Gems/1.8/gems/actionpack-3.0.1/lib/action_view/helpers/form_helper.rb:1152
case record_or_name_or_array
(rdb:1) pp record_or_name_or_array.instance_of? Array
true
(rdb:1) pp Array === record_or_name_or_array
false
(rdb:1) pp Array.object_id
2148267660
(rdb:1) pp record_or_name_or_array.class.object_id
2148267660

Это довольно определенно показывает, что хотя "record_or_name_or_array" определенно является массивом, "Array === record_or_name_or_array" возвращает false.

Кстати, если вы подозреваете, что «@ f.fields_for» - неправильный синтаксис, я пробовал как с «@f», так и без него.и получил тот же результат.Я также перезапустил RoR и мою машину, и результаты остались без изменений.

Ответы [ 3 ]

2 голосов
/ 26 июня 2011

Попробуйте:

@coupon = Coupon.last
Array === @coupon.participants #=> false
Array === @coupon.participants.find(:all) #=> true

Ассоциация @coupon.participants - это не массив, это прокси.Причина, по которой @coupon.participants.class == Array истинно, описана в activerecord-3.0.9 / lib / active_record / association / association_proxy.rb: 25

Добавлено: Еще один интересный эксперимент будет @coupon.participants.superclass.

0 голосов
/ 26 июня 2011

@coupon.is_a? Array должно возвращать true, @coupon === Array будет означать, что @coupon равно экземпляру синглтона Array

0 голосов
/ 26 июня 2011

С консоли (rails c) попробуйте выполнить:

@coupon = Coupon.last
Array == @coupon.participants

Если этот вызов возвращает false, скорее всего, ваши ассоциации установлены неправильно (т.е. has_many :participants и belongs_to :coupon).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...