2012-08-08 72 views
0

現在,我在我的rb文件中有此代碼。它工作得很好:在.rb文件(sinatra)中無法訪問函數中的變量

project = PivotalTracker::Project.find(123456) 

get '/' do 
    @accepted = project.stories.all(:current_state => 'accepted').length 
    @delivered = project.stories.all(:current_state => 'delivered').length 
    @finished = project.stories.all(:current_state => 'finished').length  

    erb :home 
end 

我想創造一個totalStories功能,而不是使用具有3條冗長線,冗餘代碼。

所以,我試過如下:

get '/' do 
    @accepted = totalStories('accepted') 
    @delivered = totalStories('delivered') 
    @finished = totalStories('finished') 

    def totalStories(storyState) 
    var estimate = project.stories.all(:current_state => storyState).length 
    return var 
    end 

    erb :home 
end 

有了這個代碼,我得到一個錯誤:

NoMethodError at/
undefined method `totalStories' for #<Sinatra::Application:0x007f89bae6c800> 

關於如何解決此錯誤的任何提示?謝謝!

UPDATE: 我感動的方法get塊外,但現在我得到一個新的錯誤:undefined local variable or method project'`

project變量之外,上面的方法定義。

值得一提的是,我在其他get塊中使用了project變量。

回答

1

使用輔助來代替:

get '/' do 
    @accepted = total_stories('accepted') 
    @delivered = total_stories('delivered') 
    @finished = total_stories('finished') 

    erb :home 
end 

helpers do 
    def total_stories(option) 
    # project = PivotalTracker::Project.find(123456) 
    project.stories.all(:current_state => option).length 
    end 
end 

添加@布林的回答,而不是上面的代碼,你可以通過具有一個對象,而不是一個幫手避免undefined method project錯誤。例如:

get '/' do 
    # same code 
end 

def total_stories(option) 
    project(12345).stories.all(:current_state => option).length 
    # The project object here causes an error since it looks for a 
    # project method (yes, instead of object) under Sinatra's Base or Application 
    # hence, we define the method inside the helpers block 
end 

helpers do 
    def project(id) 
    # Here goes the PivotalTracker find method for that particular ID. 
    end 

end 

希望有所幫助。

+0

謝謝kashyap!不幸的是,即使有助手(你的第一個代碼塊),我得到「未定義的局部變量或方法'項目'」現在將嘗試第二種方法。 – tonic 2012-08-10 14:12:30

+0

啊,第一個代碼塊的作品只有當我改變'項目'成爲'$項目'無處不在 – tonic 2012-08-10 14:27:58

+0

雖然這似乎是不好的做法,根據我讀的一些文章? – tonic 2012-08-10 20:50:12

0

爲什麼你不在'get'函數之外創建這個函數?

def totalStories(storyState) 
    project.stories.all(:current_state => storyState).length 
end 

get '/' do 
    @accepted = totalStories('accepted') 
    @delivered = totalStories('delivered') 
    @finished = totalStories('finished') 

    erb :home 
end 

您可能還會縮短您的totalStories功能,並且只保留一條語句,因爲將返回上次計算的結果。

+0

啊,但現在我遇到一個新的錯誤:未定義的局部變量或方法'項目'項目是一個變量,它定義在函數之外(也是'get'之外)。 – tonic 2012-08-08 15:21:01

+0

(我可以在函數中定義'project',但它會是一個重複的代碼行,所以它看起來不正確) – tonic 2012-08-08 15:25:47

+0

確切地說這個變量是被定義的,它存儲了什麼? – Sergey 2012-08-08 15:28:26