在rails上使用ruby中的私有方法

时间:2014-12-26 11:58:51

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

我在event.rb模型中有两个私有方法,我希望这两个方法应该在我的事件控制器中调用两个不同的操作。

event.rb

    private 

  def create_notification_on_accept
    self.notifications.create(action_type: "Accept", actor_id: participant.id,
    user_id: user_id)
 end

 def create_notification_on_reject
  self.notifications.create(action_type: "Reject", actor_id: participant.id,
  user_id: user_id)
end

events_controller.rb

  def accept_invitation
   @participants.where(user_id: current_user.id).update_all(is_attending: true)
   render "update"
 end

def reject_invitation
 @participants.where(user_id: current_user.id).update_all(is_attending: false)
 render "update"
end

如何在控制器中调用这两个私有方法?

任何建议都有帮助。

4 个答案:

答案 0 :(得分:1)

ruby​​中没有私有方法(我们都知道在Java中),你可以使用Object#send方法调用它们。

http://ruby-doc.org/core-2.2.0/Object.html#method-i-send

答案 1 :(得分:1)

您可以使用类方法在控制器中调用它们。

 private 

 def self.create_notification_on_accept(event)
   # I don't know where are you getting participant id, so pass it if you need
   # additionally, if they are available on event object then you could do
   # event.participant.id, event.user_id since the background of the code is not given
   # hence I'm making some assumptions 
   event.notifications.create(action_type: "Accept", actor_id: participant.id,
   user_id: user_id)
 end

 def self.create_notification_on_reject(event)
   event.notifications.create(action_type: "Reject", actor_id: participant.id,
 user_id: user_id)
 end

在你的控制器中你可以做到这一点

def accept_invitation
   #find event so you can pass it as a param
   Event.create_notification_on_accept(event)
   @participants.where(user_id: current_user.id).update_all(is_attending: true)
   render "update"
end

然而,更好的做法是使用回调而不是类方法。这样,您可以减少在任何地方调用方法的开销,而不是将其留在模型上以了解何时调用。

答案 2 :(得分:0)

你不能调用私有方法,没有办法直接。你可以创建那些方法但是公开的包装器。最佳解决方案将他们转移到公共场合

答案 3 :(得分:0)

有多种方法可以在触发特定控制器操作时触发这些方法。

  1. 让它们成为回调,这些可能会在您保存事件时触发。请参阅http://guides.rubyonrails.org/active_record_callbacks.html

  2. 将方法放在服务层对象中,以更新参与者,并创建通知。在这种情况下,您的控制器方法可以创建一个新的Reply实例。然后,Reply类可以具有update_participants和create_notification

  3. 的方法

    一般来说,如果你想调用或测试私有方法,那么可以把它想象成这些方法想要成为公共方法的指标,可能在另一个类中。