2011-01-13 4 views
1

Ich baue meine erste App mit ROR und stolperte über ein paar Probleme durch mein Verständnis der MVCIdentische Dateien verhalten sich anders durch mit Controller

ich eine Seite, verknüpfen ein neues Element hinzuzufügen, und diese funktioniert gut, Rails bringt es magisch an den Item-Controller und irgendwie durch Zauberei weiß es, in der Methode "neu" zu suchen, wie die Seite neu heißt.

Aber diese Schicht ist verwirrend ich, wie ich brauche, um jetzt eine andere Version von neuer, gleicher Funktionalität zu erstellen, aber mit einem anderen Blick so ein anderes Layout zu verwenden, um application.html.erb

Also ich versuchen, Erstellen Sie eine Kopie von new.html.erb und erstellen Sie die Datei Bookmarklet.html.erb - beide enthalten genau den gleichen Code: einen Link zu einem Formular. aber natürlich wird bookmarklet fehler auf mir, weil es nicht diese verbindung im controller hat - wie kann ich 'bookmarklet' verdrahten, so dass ich die neue methode aufrufen kann und damit sie sich ähnlich wie die identischen neuen verhalten kann. html.erb

Auch, wie kann ich die neue Bookmarklet.html.erb sagen, um die application.html.erb zu ignorieren und sein Layout von einer anderen Datei zu bekommen?

Dank im Voraus

Antwort

0

Eine bessere Art, die Dinge zu denken, ist mit dem Controller statt der Ansicht html.erb Dateien zu starten. Jede öffentliche Methode in Ihrem Controller ist also eine Seite oder eine Aktion in der Site. Wenn Sie eine neue Aktion oder Seite benötigen, fügen Sie die Methode zuerst dem Controller hinzu. Erstellen Sie dann die relevanten Ansichtsdateien.

Also in Ihrem Controller benötigen Sie so etwas wie:

def bookmarklet 
    @item = Item.new(params[:item]) 
    @item.save 
    render :template => "items/bookmarklet.html.erb", :layout => "different_layout.html.erb" 
end 

Normalerweise müssen Sie in der Steuerung nicht aufrufen machen manuell, aber da Sie ein anderes Layout als die Standard wollen, müssen Sie angeben, Es verwendet Rendern.

+0

Entschuldigung, auf den zweiten Teil, der mir als das leichtere Problem erscheint, wenn ich versuche, die Vorlage zu rendern, habe ich den Fehler: Vorlage fehlt - das ist, wenn ich eine Bookmarklet.html.html.erb-Datei in Layouts erstellen? Fehlende Vorlage/Bookmarklet mit {: handlers => [: erb,: rjs,: Builder,: rhtml,: rxml],: formats => [: html],: locale => [: en,: en]} in Sichtpfaden "/ Users/toast/rails_projects/xxxx/app/views" – toast

+0

Sorry, ich hatte das oben genannte falsch. Ich habe gerade die Renderzeile aktualisiert, da Sie jetzt den vollständigen Dateinamen angeben müssen. Und dann brauchst du eine Datei "different_layout.html"."in Ihrem app/views/layouts verzeichnis. –

+0

ah-ha ..... render: vorlage => 'layouts/bookmarklet',: layout => 'layouts/bookmarklet' war was ich brauchte vielen dank - jetzt der erste und komplizierterer Teil! – toast

0

Die Magie passiert in den Routen. Rails verwendet sogenannte RESTful-Routen, die HTTP-Verben aufnehmen und Standardaktionen zuweisen. Die Aktion new ist eine GET-Anforderung in HTTP-Sprache, und wenn Sie Gerüstbau oder nach REST verwenden, wird der Ruby-Aufruf ein neues Objekt im Controller als Instanzvariable erstellen, damit Sie es in Ihrer Ansicht verwenden können.

Sie müssen den Routen mitteilen, dass Sie diese Anordnung aufbrechen und/items/bookmarklet im Controller verwenden möchten.

In Ihrem routes.rb Datei ersetzen resources :items mit

resources items do 
    member do 
    get 'bookmarklet' 
    end 
end 

In Ihrem Controller Put:

def bookmarklet 
    @item = Item.new 
    render :template => "bookmarklet", :layout => "different_layout" # or you can put this on the top of the controller, which is my style, but whatevs. 
end 

Sie in partials aussehen sollte, wenn Sie dies tun, wie sie Ihren Code immens aufzuräumen .

Verwandte Themen