2014-12-26 37 views
0

我在我的event.rb模型中有兩個私有方法,我希望這兩個方法應該在我的事件控制器中的兩個不同的操作上調用。在rails上使用私有方法

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 

我怎麼能說我的控制器這兩個私人注資方式?

任何建議是有幫助的。

+1

你爲什麼不讓他們公開? – Santhosh

+1

「私有方法只能由同一類內或同一模塊內的方法調用」。這是私人方法的基本定義。 – shivam

+0

Santosh,如果我將它們公開,我可以直接從控制器操作訪問它們嗎? – Packer

回答

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 

然而,美好的事情,這將是有回調,而不是類的方法。這樣可以減少在任何地方調用該方法的開銷,相反,您可以將它留在模型上以知道何時調用。

+0

使用callabacks很容易做到這一點。不幸的是,我們無法爲create_invitation和reject_invitation創建回調,因爲這些不是rails默認回調。 當我說他們與Event.metod_name如你所說,它給了我錯誤。 錯誤日誌 NoMethodError(未定義的方法'create_notification_on_create '爲#<類別:0x00000008c62a48>): 應用程序/控制器/ events_controller.rb:47:在'accept_invitation' – Packer

+0

那麼它已得到沒有做有關調用它。你是否看到預期類事件對象的行self.notification.create。這就是爲什麼你得到錯誤。你可以將事件對象傳遞給方法,並使用它而不是自己,它應該工作得很好。對不起,我在手機上,所以不能發佈任何代碼。但我相信那是導致問題的原因。 –

+0

我改變了我的代碼,如你所說。不幸的是,它不工作。可能是我可以在這裏與我的代碼。請檢查並幫助我做錯的地方。 http://pastebin.com/PVd21r30 謝謝 – Packer

0

您無法調用私有方法,因此無法直接調用它。你可以創建這些方法的包裝,但是作爲公共。最好的解決方案將它們移動到公共segemnt

+0

如果我將它們公開,我可以直接在控制器操作中調用這兩種方法嗎? – Packer

+0

你可以把它們叫做那個類的對象。如果你在控制器'Yes'中獲得了'event'對象,則不能在沒有'event'對象的情況下調用它們。 – Nermin

+0

@Prabhakar,你可以這樣稱呼他們。你必須在對象上調用它們或使用類方法,並像我在我的回答中提到的那樣,在他們的類上調用它們。 –

0

有許多方法可以在觸發特定控制器操作時觸發這些方法。

  1. 使它們回調,當你保存事件時,它們可能會觸發。請參閱http://guides.rubyonrails.org/active_record_callbacks.html

  2. 將方法放入服務層對象中,該對象更新參與者並創建通知。在這種情況下,你的控制器方法可以創建一個新的回覆實例該回復類,然後可以有方法update_participants,並create_notification

一般來說,如果你想打電話,或測試私有方法,則認爲這是一個指標,這些方法要成爲公共方法,可能在另一類。