2011-05-21 69 views
0

我在控制器调用此方法:为什么我会得到一个nomethod错误?

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 

为什么轨告诉我,该方法是不确定的?

回答

1

如果你定义了这个方法,instance方法,所以你需要调用它是这样的:

a = YourModelName.new 
a.delete_heard_timeline_event(your_parameters) 

,如果这个方法是class方法,以便调用:

YourModelName.delete_heard_timeline_event(your_parameters) 
+0

乐意帮助你 – bor1s 2011-05-21 06:27:46

0

我见已经接受了答案,但要回答您的问题:

如果此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 

末的。尝试方法试图触发一个方法,在它的参数,但仅限于非空的对象,所以你可以安全地使用错误的参数来调用它。

然后,只需:

TimelineEvent.delete_heard_event(current_user.id, @showable_video.user.id, @showable_video.video.id) 

的问候,在降噪

+0

感谢,什么是'scoped'吗? – 2011-05-21 17:03:07

+0

另外你如何知道Rails最多可以处理3个条件?它不是什么在抛出错误 – 2011-05-21 17:48:38

+0

scoped为此对象创建ActiveRelation实例(在此示例中,它不是必需的,因为.where的功能相同:)但我喜欢写它。关于这三个条件 - 我以为我在ActiveRecord代码中看到它定义了find_by_ *属性......但是我可能是错的。那么是什么导致了错误呢? – 2011-05-21 22:48:20

相关问题