我在控制器中调用此方法:
delete_heard_timeline_event(current_user.id, @showable_video.user.id, @showable_video.video.id)
我在我的模型中明确了它:
def delete_heard_timeline_event(actor_id, subject_id, secondary_subject_id)
TimelineEvent.find_by_actor_id_and_subject_id_and_secondary_subject_id_and_event_type(actor_id, subject_id, secondary_subject_id, 'heard_event').destroy
end
为什么 rails 告诉我该方法未定义?
如果你将此方法定义为instance
方法,那么你需要像这样调用它:
a = YourModelName.new
a.delete_heard_timeline_event(your_parameters)
如果此方法class
则调用:
YourModelName.delete_heard_timeline_event(your_parameters)
我看到已经有被接受的答案,但要回答你的问题:
如果由于这一行而弹出此 NoMethodError:
find_by_actor_id_and_subject_id_and_secondary_subject_id_and_event_type
我认为 Rails 最多可以处理 3 个条件,而您那里有 4 个条件。
因为你在 Rails 3 中,你可以这样做:
class TimelineEvent
def self.delete_heard_event(actor_id, subject_id, sec_id)
self.scoped.where(:actor_id => actor_id,
:subject_id => subject_id,
:secondary_subject_id => sec_id,
:event_type => 'heard_event').first.try(:destroy)
end
end
最后的 .try 方法尝试在其参数中触发方法,但仅在非 nil 对象上触发,因此您可以使用错误的参数安全地调用它。
然后只是:
TimelineEvent.delete_heard_event(current_user.id, @showable_video.user.id, @showable_video.video.id)
问候, NoICE