пользовательский method_missing игнорируется, если экземпляр определен через ассоциацию ActiveRecord - PullRequest
2 голосов
/ 05 февраля 2011

У меня есть представления, которые могут быть в разных состояниях, и я написал переопределение method_missing, которое позволяет мне проверять их состояние с помощью вызовов, таких как

submission.draft?
submission.published?

Это прекрасно работает.


IКроме того, по разным причинам, которые могут быть не столь хороши, есть модель под названием Packlet, которая принадлежит_ собранию и принадлежит_ представлению.Однако я был удивлен, обнаружив, что

packlet.submission.draft?

возвращает NoMethodError.С другой стороны, если я жестко закодирую метод #draft? в Submission, вызов вышеупомянутого метода работает.


Как мне получить методы method_missing для распознавания, даже когда экземпляропределяется через ассоциацию ActiveRecord?

1 Ответ

2 голосов
/ 05 февраля 2011

Вы добавили черновик?метод к вашему answer_to?метод для этого объекта?Я думаю, что проблема может возникнуть там.Что происходит, когда вы печатаете:

submission.respond_to?(:draft?)

Чтобы это исправить, на самом деле напишите response_to?метод, подобный следующему:

def respond_to?(method, include_priv = false) #:nodoc:
  case method.to_sym
  when :draft?, :published?
    true
  else
    super(method, include_priv)
  end
end

Я бы порекомендовал реализовать это, не используя взамен method_missing, поэтому, выполняя некоторое метапрограммирование, подобное этому:

class Submission
  [:draft, :published].each do |status|
    define_method "#{status}?" do
      status == "#{status}?"
    end
  end
end
...