2012-07-04 59 views
1

我剛剛開始使用sinatra編寫一個合理簡單的網站。我的問題是,我想重構主app.rb文件,但得到錯誤試圖訪問url params。我該如何重構我的Sinatra應用程序?

在我的get'/'動作中,Sinatra正在設置哪些參數,然後根據url中的內容做一些不同的事情。像這樣的東西。

class App < Sinatra::Application 
    ... 
    get '/' do 
    if params['code1'] 
     @network = 'code1' 
     mode code here 
    elsif params['called'] && params['mac'] 
     @network = 'code2' 
     mode code here 
    elsif params['code3'] 
     @network = 'code3' 
     mode code here 
    end 
    end  

問題是我需要一個也使用params的文件。

我已經把下面在上面的代碼:

require File.dirname(__FILE__) + '/lib/networks/code1.rb' 

其中code1.rb包括:

class App < Sinatra::Application 
    if params['login'] # == 'login' 
    pass = 'uampass' 
    elsif 
    ... 

但是,這使我有以下錯誤:

undefined local variable or method `params' for main:Object 

我如何重構這個而不會導致錯誤

+0

@meagar - 良好的編輯:) – simonmorley

回答

2

據我所知,你不能在一個應用程序中使用兩個(或更多)Sinatra應用程序。由於這兩個文件都定義了Sinatra::Application後代,因此這是不可能的。

此外,如果你想從params -hash你應該定義輔助方法Helper Documentation,你處理的路線時,或者你只是創建類,其具有采取PARAMS值作爲參數類或實例方法調用中使用的值。實際上調用另一個文件/類的參數似乎不是很好的做法。

將此放在上下文中:Sinatra應用程序組織爲處理程序。該Sinatra::Application後裔是一樣的東西,它使用支持方法(助手和Sinatra::Application後代的實例方法)或支持類,通常在其他文件中定義的,但不要從Sinatra::Application下降的主要處理程序。

爲了使這一點更清楚:

主要西納特拉文件:

require_relative 'another_file.rb' 
class App < Sinatra::Application 
    # ... 
    @a_handler = MyHandler.new 
    get '/' do 

    if params['something'] == 'wanted_value' 
     @a_handler.handle_it(params) 
    end 

end 

另一個文件( 'another_file.rb'):

class MyHandler 
    def initialize 
    @an_instance_variable = 'foobar' 
    end 
    def handle_it(params_hash) 
    if params_hash['login'] # == 'login' 
     pass = 'uampass' 
    elsif 
    # ... 
    end 
    # ... 
    # do some stuff 
    # .... 
    return pass 
    end 
end 

實際代碼當然取決於你想解決的實際問題,所以如果你想詳細說明我可以更精確地...

+0

讓我有一個快速的發揮,我會盡快回來一個更新。乾杯。 – simonmorley

+0

感謝@robustus,排序了一些調整。欣賞它。 S – simonmorley

-1

錯誤消息包含您需要知道的所有內容,與Sinatra無關。

你需要code1.rb,其中包含此(略編輯,以便它將運行):

require 'sinatra' 

class App < Sinatra::Application 
    if params['login'] # == 'login' 
    pass = 'uampass' 
    end 
end 

的Ruby代碼進行評估,因爲它遇到它。在這種情況下,您需要'code1.rb',因此它會評估該文件中的代碼。它遇到'params',並詢問「是否有一個局部變量或方法的名稱?」。沒有,所以它失敗了,因爲你見過。打開一個irb會話並檢查出來。

ruby​​中的類定義只是一個範圍的表達式。

關於Sinatra:params在路徑聲明中使用的塊中可用。

我推薦閱讀Sinatra: Up and Running,這解釋了正在發生的一些'魔術'(與Sinatra Book的一個很好的伴侶)。

+0

在所有應有的尊重下,你的回答實際上並不回答我的問題,甚至不能解決問題。我曾經與重構相關的查詢並沒有得到參數。 – simonmorley

+1

@simonmorley「我如何重構這個而不會導致錯誤」。從技術上講,你不能重構那些首先不起作用的東西,但我讓它滑過。你應該重新閱讀你的問題,看看它的真實含義,而不是你想象的那樣。 – ireddick

相關問題