2016-07-12 12 views
0

Rubyを学習していてすぐに、2つの文字列を1つに連結しようとすると、特有のものがあります。ここでは、コードが取り除かirrevelant部分で、ちょうどシナトラがそれを実行します言うことができます、:Ruby未知数+ 2つの文字列を結合しようとしています

class CMS 
    # Set the site path root. 
    @sitePath = "./site" 

    get '/' do 
     renderCache = File.readlines(@sitePath + "index.liquid") 
    end 
end 

、ページをロードするには、私はrenderCache = File.readlines(@sitePath + "index.liquid")ライン上

NoMethodError at/
undefined method `+' for nil:NilClass 

で迎えています。なぜ文字列を連結することを拒否しているのですか?

答えて

3

クラスレベルでインスタンス変数を設定することはできません。インスタンスメソッドでそれらを設定する必要があります。

ルックのあなたがこれを行うことができますので、あなたはシナトラを使用しているように:

は1つがRailsのアプリの中にないよう「フィルタの前に」の作り方についてhereを参照してください。この解決策はモジュラースタイルのSinatraアプリ向けです。一例を示す

:あなたの代わりに、インスタンス変数の定数を使用する場合

class CMS < Sinatra::Base 
    before do 
    @sitePath = "./site" 
    end 
    get '/' do 
    renderCache = File.readlines(@sitePath + "index.liquid") 
    end 
end 
CMS.run! 

あなたはまた、既存のコードを保つことができる:

class CMS 
    # Set the site path root. 
    SitePath = "./site" 

    get '/' do 
     renderCache = File.readlines(CMS::SitePath + "index.liquid") 
    end 
end 

を私はあなたのエラーを読んで、見てどのように説明するためにエラーの場合:

undefined method '+' for nil:NilClassは、何もないものを+と呼んでいることを意味します。コードを参照すると、nil変数が@sitePathであることが示されます。定義されていないインスタンス変数はnilと評価されます。これは標準変数とは異なり、未定義の変数エラーが発生します。

+2

名前空間の使用が推奨されます。 Rubyの伝統によれば、定数は 'SITE_PATH'のように指定されており、ここではコンテキストが与えられているので、' CMS :: 'は暗黙指定されて省略することができます。 – tadman

関連する問題