2012-09-05 45 views
0

我在ApplicationController中創建文件的方法,應設置我的一切行動實例變量:在ApplicationController中控制器設置實例變量不工作

def self.set_body_id(id) 
    print "This is test" 
    self.instance_variable_set(:@body_id, id) 
end 

,當我在另一個控制器調用此方法,像這樣:

class HostingController < ApplicationController 
    set_body_id "Test" 

    def index 
    end 
end 

..沒有任何反應。該視圖中不存在變量@body_id。所以我運行一個rails控制檯來檢查這個函數是否被執行,並且如我所料,當我調用HostingController.new時,我得到了一個This is test字符串,但仍未定義@body_id

另外,我從self.variable_instance_set刪除self,甚至用@body_id = "Test"補充此行,但這仍然不起作用。我究竟做錯了什麼?

編輯:

我看到我犯了一個錯誤。我嘗試在創建類實例之前設置一個實例變量。似乎self.set_body_id應該涉及initialize類,但仍然不知道如何去做。

+1

你在混合類和實例變量 – apneadiving

+0

@apneadiving:所以,這是一個得到這個工作的任何方式?我喜歡有一個可從視圖訪問的控制器範圍的變量。 – Galmi

回答

0
class ApplicationController < ActionController::Base 
    protect_from_forgery 

    def self.set_body_id(id) 
     self.class_variable_set(:@@body_id, id) 
    end 

    before_filter :set_body_attributes 

    private 

    def set_body_attributes 
     @body_id = self.class.class_variable_get(:@@body_id) 
    end 
end 

謝謝您的答覆,我能弄明白感謝@apneadiving提示:)

0

我認爲你必須把它寫這樣的:

def set_body_id(id) 
    instance_variable_set("@body_id", id) 
end 

更新:我剛纔看到你用這應該是一個實例方法一類方法。我更新了代碼。

+0

仍然不起作用,與':@ body_id'沒有區別。 – Galmi

0

這會幫助你

class ApplicationController < ActionController::Base 

    protected 
     def set_body(id) 
     ApplicationController.get_id(id) 
     end 

    def self.get_id(id) 
     self.class_variable_set(:@@body, id) 
     end 
    end 

您的主機控制器

class HostingController < ApplicationController 
    before_filter :set_body 

protected 

    def set_body 
     @body = super(params[:id]) 
    end 
end 

@body實例變量,我從set_body設置應該可以在所有方法中使用。嘗試通過檢查它

相關問題