Forum: Rails Germany Frage zu ApplicationHelper

Posted by Torsten Flammiger (Guest)
on 2008-03-06 19:21
(Received via mailing list)
servus an die Liste,

habe folgendes Problem: auf der Startseite möchte ich so etwas wie
einen statischen Block mit Daten aus der Datenbank anzeigen.
Dazu habe ich einen Helper in app/helpers/application_helper.rb
angelegt:

def newsblock
 termin = Treffen.find(:first)
 termin.next
end

In app/views/layouts/application.rhtml rufe ich die Funktion auf.
Das funktioniert genau einmal, dann gibts nen Fehler a'la:
ActionView::TemplateError (A copy of ApplicationHelper has been... usw.
Einen simplen Text ausgeben geht ohne Probleme...

Was kann ich machen, damit das geht?
Bin ich mit meiner Vorgehensweise überhaupt auf dem richtigen Weg?
Die Suche in $ENGINE ergab keine zielführenden Ergebnisse...

Danke im Voraus
Torsten
Posted by Nicolai Reuschling (codeblogger)
on 2008-03-06 19:30
(Received via mailing list)
Warum überhaupt in einen Helper (und nicht in den Controller der
Startseite)?

Zumindest der Teil "termin = Treffen.find(:first)" gehört meines 
Erachtens
in eine Controller-Action:
@termin=Treffen.find(:first).

Grüße
Nicolai
Posted by Torsten Flammiger (Guest)
on 2008-03-06 19:48
(Received via mailing list)
On 19:29 Do 06 Mär, Codeblogger wrote:
> Warum überhaupt in einen Helper (und nicht in den Controller der
> Startseite)?

hmm, das ist IMHO nicht zielführend: der Startseitencontroller wird ja
auch nur, wie der Name schon sagt, beim Aufruf der Startseite
aufgerufen. Ich will aber, das der HTML-Block immer da steht.

> Zumindest der Teil "termin = Treffen.find(:first)" gehört meines Erachtens
> in eine Controller-Action:
> @termin=Treffen.find(:first).

Ich meinte halt, das das in den ApplicationController gehört, dann
kann ich es im zugehörigen Layout verwenden.
Aber wie heißt die entsprechende Aktion? :-) Sowas wie
'index' oder 'list' gibts ja da nicht... - oder etwa doch?

Torsten
Posted by Nicolai Reuschling (codeblogger)
on 2008-03-06 20:02
(Received via mailing list)
Du vermischst gerade ganz wild Helper & Controller. Außerdem hast Du uns
bisher die Info vorenthalten, dass der Block auf jede Seite soll. Im
Anfangspost hast Du nur von der Startseite gesprochen.


Grüße
Nicolai
Posted by Torsten Flammiger (Guest)
on 2008-03-06 20:16
(Received via mailing list)
On 20:01 Do 06 Mär, Codeblogger wrote:
> Du vermischst gerade ganz wild Helper & Controller. Außerdem hast Du uns
> bisher die Info vorenthalten, dass der Block auf jede Seite soll. Im
> Anfangspost hast Du nur von der Startseite gesprochen.

unglücklich formuliert - zugegeben

Aber wie kann ich das umsetzen ohne den genannten Fehler zu provozieren?
Von meinem Verständnis her gehört so etwas in den ApplicationController,
denn der wird ja immer aufgerufen, wenn eine Seite angefordert wird.

Ich lasse mich da höchst gern eines Besseren belehren :-)

Torsten
Posted by Nicolai Reuschling (codeblogger)
on 2008-03-06 20:26
(Received via mailing list)
Mit einem Before-Filter[1] in den ApplicationController.

Kurz angerissen:

class ApplicationController < ActionController::Base
  before_filter :grab_news
  def grab_news
    @termin = Termin.find(:first)
  end
end

Ich nehme mal an, next gibt Text oder ähnliches aus. Dann kannst Du 
einen
ApplicationHelper schreiben, der ungefähr so aussieht:

module ApplicationHelper
  def newsblock
    @termin.next
  end
end

In Deinem Template/View/Partial kannst Du dann wie gewohnt mit <%=h
newsblock %> darauf zugreifen. Das ganze geht auch noch mit Caching, 
aber
probier' es erstmal so...

Ich hoffe, das hilft Dir weiter.

Grüße,
Nicolai


[1]
http://api.rubyonrails.org/classes/ActionController/Filters/ClassMethods.html#M000312


Am 06.03.08 schrieb Torsten Flammiger <nospam@airpost.net>:
Posted by Torsten Flammiger (Guest)
on 2008-03-06 20:34
(Received via mailing list)
On 20:25 Do 06 Mär, Codeblogger wrote:
> 
> newsblock %> darauf zugreifen. Das ganze geht auch noch mit Caching, aber
> probier' es erstmal so...
> 
> Ich hoffe, das hilft Dir weiter.

das ist genau der (ausführliche) Denkanstoss! :-)
Danke! - so funktioniert es.

Torsten
Please log in before posting. Registration is free and takes only a minute.
Existing account (Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
No account? Register here.