为什么我会得到一个nomethoderror?

时间:2011-05-21 06:07:37

标签: ruby-on-rails ruby ruby-on-rails-3

我在控制器中调用此方法:

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告诉我该方法未定义?

2 个答案:

答案 0 :(得分:1)

如果您将此方法定义为instance方法,则需要像这样调用它:

a = YourModelName.new
a.delete_heard_timeline_event(your_parameters)

如果此方法为class方法,请致电:

YourModelName.delete_heard_timeline_event(your_parameters)

答案 1 :(得分: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

最后的.try方法尝试在其参数中触发一个方法,但只在非零对象上触发,因此可以安全地用错误的参数调用它。

然后只是:

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

问候,NoICE

相关问题