簡體   English   中英

從另一個類Ruby調用實例方法

[英]Calling instance method from another class ruby

我遇到此運行時錯誤:

11843:E, [2015-05-13T11:00:00.467150 #9464] ERROR -- : 2015-05-13T11:00:00-0400: [Worker(delayed_job host:server pid:9464)] Job CronJob (id=5550d0f84d6f747bcb000000) FAILED with **NoMethodError: undefined method `loadData' for AdminController:Class**

如何從cronJob類調用方法loadData()? 我使用控制台測試了代碼,如果從控制台調用,則可以正常工作: AdminController.new.loadData()

    class AdminController < ApplicationController

    ...

    def setLoadSchedule
        logger.debug "set hour #{params[:admin][:hour]}"
        sethour = params[:admin][:hour]

        Delayed::Job.find(Perseus::Application.config.delayed_job_id).destroy if Perseus::Application.config.delayed_job_id != :nil
    Perseus::Application.config.delayed_job_id = Delayed::Job.enqueue(CronJob.new, cron: '0 ' << sethour << ' * * 1-5')

    hide_action :loadData

    def loadData()
     ...
    end 

    private
    def isAdmin
        if !current_user.admin
        redirect_to root_path
        end
    end

    end

  class CronJob < Struct.new("CronJob")

    def perform
      AdminController.new.loadData()
    end
  end   

不要自己創建控制器,如果確實需要在應用程序的下部調用某些控制器方法,請將當前控制器的實例作為變量傳遞。

例:

def index #method of controller AdminController
  CronJob.new(self).perform #so now you are passing controller which inherits from ApplicationController, so loadData method can be invoked on it(if it is public)
end

還有一件事,在ruby中,我們寫的是load_data而不是loadData :)

再一件事#2

如果您的請求由FooController處理,並且您想從AdminController調用方法,則意味着您應該將load_data方法封裝在第三個對象( DataLoader )中。 AdminContorller繼承於FooController不是解決方案!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM