我在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
如何在控制器中调用这两个私有方法?
任何建议都有帮助。
答案 0 :(得分:1)
ruby中没有私有方法(我们都知道在Java中),你可以使用Object#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)
有多种方法可以在触发特定控制器操作时触发这些方法。
让它们成为回调,这些可能会在您保存事件时触发。请参阅http://guides.rubyonrails.org/active_record_callbacks.html
将方法放在服务层对象中,以更新参与者,并创建通知。在这种情况下,您的控制器方法可以创建一个新的Reply实例。然后,Reply类可以具有update_participants和create_notification
一般来说,如果你想调用或测试私有方法,那么可以把它想象成这些方法想要成为公共方法的指标,可能在另一个类中。