2009-08-18 5 views
2

Ich bin sicher, dass dies mit den Feinheiten zu tun hat, die in Shoes> Manual> Rules erwähnt wurden, aber ich verstehe es einfach nicht. Wenn jemand würde erklären wollen, warum @var == Nil im folgenden Code ... Ich dachte, ich könnte Besuch verwenden, um zwischen verschiedenen Ansichten in meiner Anwendung wechseln, aber das wird nicht funktionieren, wenn ich den gesamten Zustand verliere.Warum verliere ich meine Instanzvariablen, wenn ich Shoes # 'visit' anrufe?

class MyShoe < Shoes 
    url '/', :index 
    url '/somewhere', :somewhere 

    def index 
    @var = para link("go somewhere", :click => "/somewhere") 
    end 

    def somewhere 
    para "var = #{@var.inspect}" 
    end 
end 

Shoes.app 

Antwort

2

_ warum sich dieses Problem beantwortet hat, und ich werde in einer Minute das bekommen. Erstens ist die einfachste Möglichkeit, Daten zu übergeben (insbesondere Strings) zwischen verschiedenen Urls ist wie folgt:

class MyShoe < Shoes 
    url '/', :index 
    url '/somewhere/(\d+)', :somewhere 

    def index 
    @var = para link("What is 2 + 2?", :click => "/somewhere/4") 
    end 

    def somewhere(value) 
    para "2 + 2 = #{value}" 
    end 
end 

Shoes.app 

Es wird die Untergruppen der Regex übereinstimmen und die passenden Strings als Parameter an die Methode übergeben. Gelegentlich nützlich, aber es wird in Eile unhandlich. Die andere Lösung ist Konstanten oder Klassenvariablen zu verwenden, wie _why explains here:

OK, täuscht so um weiter sieht es aus wie alle Instanzvariablen erhalten

am Anfang jeder Methode innerhalb einer Schuhe Unterklasse abgewischt .
Das ist OK, denke ich. Also, was ist der bevorzugte Weg, um einige Daten
zu haben, die von einer Shoes URL zu einer anderen geteilt wird? Übergabe von einer Seite
an die nächste in der URL selbst funktioniert - wenn es eine Zeichenfolge ist. Wenn es nicht
eine Zeichenfolge ist, was sollten Sie verwenden - @@ class_variables?

Sicher könnten Sie eine Klasse Var verwenden. Diese sind garantiert durchgehend das Leben der App. Oder eine Konstante.

Auch kommt Shoes mit SQLite3, Daten können dort übergeben werden.

In Ihrem Beispiel würde es so aussehen:

class MyShoe < Shoes 
    url '/', :index 
    url '/somewhere', :somewhere 

    def index 
    @@var = para link("go somewhere", :click => "/somewhere") 
    end 

    def somewhere 
    para "var = #{@@var.inspect}" 
    end 
end 

Shoes.app 
+0

Thanks again Pesto. Ich denke, ich bin fertig damit, dich für den Tag zu belästigen :-) – Simon