Link_to mit eigener confirm-Methode überladen?

ja hallo erstmal,…

ich habe in einer Webanwendung link_to überladen, um bei best. actions eine
Warnung anzuzeigen:

def link_to(name, options = {}, html_options = {},
*parameters_for_method_reference)
unless (params[:action] == “list” || options[:safe] == ‘1’ ||
params[:action] == “index” || params[:action] == “show” )
html_options[:confirm]= “Leaving page - input will be lost.”
end
super(name, options,html_options,*parameters_for_method_reference)
end

Das funktionierte soweit ganz gut. Nun würde ich jedoch gerne statt der
Standard-confirm-Funktion eine eigene verwenden. (Um gemachte Änderungen
besser mit JavaScript zu berücksichten.
Ein naiver Testansatz:
html_options[‘onclick’] = “alert(test);”
Zum Einfügen eines onClick-Tags in den link schlug leider fehl.

Ich stehe gerade etwas auf dem Schlauch, da ich in der doku keinen
hinweis
darauf gefunden habe, wie ich ein onClick-Attribut in den Link schreiben
kann.
Wisst ihr mehr?

Danke,
Alles Gute
Jan

Hallo Jan,

suchst Du vielleicht den Helper link_to_function
/http://api.rubyonrails.org/classes/ActionView/Helpers/JavaScriptHelper.html#M000636),
mit dem Du Deine Javascript-Funktion aufrufen kannst?

Grüße,
Nicolai

Hi,

Also ich persönlich würd ja beim link_to nur einen class name
mitgeben und den dann für’s unobstrusive Javascript zu
verwenden. Aber ist natürlich Geschmackssache ob man
lesbaren Code will oder nicht.

ciao, tom

Am 26.10.2007 um 16:11 schrieb Jan L.:

params[:action] == “index” || params[:action] == “show” )
Ein naiver Testansatz:
html_options[‘onclick’] = “alert(test);”
Zum Einfügen eines onClick-Tags in den link schlug leider fehl.

Ich stehe gerade etwas auf dem Schlauch, da ich in der doku keinen
hinweis
darauf gefunden habe, wie ich ein onClick-Attribut in den Link
schreiben
kann.


Thomas R. “TomK32” Koll <> http://tomk32.de <> http://ananasblau.de
just a geek trying to change the world

Guten Tag allerseits,

Am Fri, 26 Oct 2007 16:39:20 +0200 schrieb “Thomas R. Koll”
[email protected]:

Also ich persönlich würd ja beim link_to nur einen class name
mitgeben und den dann für’s unobstrusive Javascript zu
verwenden. Aber ist natürlich Geschmackssache ob man
lesbaren Code will oder nicht.

ich mich hier erneut ausdrücklich anschließen. Schaut euch unbedingt das
UJS-Plugin oder besser noch dessen Nachfolger (bzw. Ersatz) lowpro:
http://www.danwebb.net/lowpro

Beste Grüße von
Moritz

Am Freitag, 26. Oktober 2007 schrieb Thomas R. Koll:

Hi,

Also ich persönlich würd ja beim link_to nur einen class name
mitgeben und den dann für’s unobstrusive Javascript zu
verwenden. Aber ist natürlich Geschmackssache ob man
lesbaren Code will oder nicht.

das heißt aber, das beim Laden der Seite der Browser erstmal den ganzen
DOM-Baum durchsuchen muss um, nur alle Elemente zu finden, die zu dieser
Klasse gehören.
Das kostet ihmo bei größeren Tabellen sehr viel Zeit. (Ich habe schon mal
eine
Anwendung (wir hängen einen event-Listener an Elemente in einer Tabelle
mehreren 100 Zeilen) durchaus in die Minuten ging)

Da gehe ich lieber hin, lege eine js-Funktion in der application.js ab
und
bringe link_to bei, einfach ein onclick=“myConfirm()” in das Attribut
mit
aufnehmen. Dazu muss kein DOM-Baum durchsucht werden…
Wegen der Code-Lesbarkeit mache ich mir keine Sorgen - so viel steht in
der
application.js nicht - und inline-JS-Code ist praktisch nicht vorhanden.

Keep smiling
yanosz

On 27.10.2007, at 17:12, Önder Kara wrote:

Jetzt will ich aber das ganze eingrenzen und gebe als Suchbegriff
noch den Kundennamen und Rechnungsdatum ein. Wie sollte hier meine
Abfrage denn aussehen? Bietet
Activerecord hier schon was an?

Du kannst entweder direkt auf der Assoziation ein find absetzen:
article.invoices.find(:all, :conditions => [’…’])

oder einfach die Assoziation in das obige find joinen:

Article.find(:all, :select => “a.*”, :conditions => [‘name = ? and
i.attr1 = ? and i.attr2 = ?’, params[:articlename], params
[:customer], params[:date_of_purchase]], :from => ‘articles a,
invoices i’)

Das ist an sich keine Spezialitaet von ActiveRecord, sondern nur eine
Abbildung des entsprechenden SQLs, und eine von mehreren Moeglichkeiten.

Cheers, Mathias

Hallo Matthias,

vielen Dank. Dein Wink in die Richtung war meine Lösung.
Über deine Lösung bin ich dann zu einem JOIN gekommen.

Article.find(:all, :conditions => [‘articles.name = ? and
invoices.attr1 = ?’, params[:articlename], params
[:invoice_date]], :join => " invoices ON articles.id =
invoices.article_id")

Ich hatte mir eigentlich was anderes vorgestellt das weniger mit SQL
zu machen aber vorerst ist das eine annehmbare Lösung. Aber das
schreit mir ganz nach einem neuen(?) Plug-in. Wenn ich ein wenig Luft
hab werd ich mir das mal genauer anschauen.

Grüße und danke
Önder

Am 27.10.2007 um 18:32 schrieb Mathias Meyer:

Hallo zusammen,

Ich sitze gerade an einem grausamen Problem das ich schon seit ehh
und je vor mich her schiebe bzw. öfters ignoriere.
Jetzt wird es aber akut und ich will wissen ob es hier eine Ruby-like
way-to-do gibt.

Ich habe mehrere Modelle:

Article, Customer, Invoice

Die Relationen sehen folgendermaßen aus:

Article:
has_and_belongs_to_many :invoices

Customer
has_many :invoices

Invoice:
has_and_belongs_to_many :articles
belongs_to :customer

Für diese 3 Modelle habe ich eine Suchmaske erstellt. Auf der Maske
sind Suchkriterien wie z.B.:

Customername

Articlename

Invoicenumber
Invoicedate
etc…

Jetzt möchte ich hier z.B. Nach dem Artikel Apfel (passend zu meinem
neuen iMac :wink: ) suchen
Die Suchabfrage soll mir eine Liste zeigen mit allen Rechnungen in
dem ein oder mehrere Äpfel enthalten sind.

article = Article.find(:first, :conditions => [“name = ?”, params
[:articlename]])
article.invoices

würde mir rein theoretisch eine Liste geben.

Jetzt will ich aber das ganze eingrenzen und gebe als Suchbegriff
noch den Kundennamen und Rechnungsdatum ein. Wie sollte hier meine
Abfrage denn aussehen? Bietet
Activerecord hier schon was an?

GrüßeÖnder

Hey Önder,

Am Sun, 28 Oct 2007 10:16:58 +0100 schrieb Önder Kara
[email protected]:

Article.find(:all, :conditions => [‘articles.name = ? and
invoices.attr1 = ?’, params[:articlename], params
[:invoice_date]], :join => " invoices ON articles.id =
invoices.article_id")

das ist äquivalent zu

Article.find(:all, :conditions => [‘articles.name = ? and
invoices.attr1 = ?’, params[:articlename], params[:invoice_date]],
:include => :invoices)

Dabei ist allerdings zu beachten, dass du nur genau dann ein Ergebnis
bekommst, wenn du den exakten Artikelnamen übergibst sowie das dazu passende
attr1. Ist das wirklich das, was du brauchst? Ansonsten schau dir mal
http://wiki.rubyonrails.org/rails/pages/TextSearch an.

Beste
GrüßeMoritz

Hallo Moritz,

Genau das war genau was ich brauch. Das ist ruby-like. Ich nutze die
include Option bereits um Relationen vorzuladen. Es war mir nur nicht
bekannt
dass man in conditions direkt den Tabellennamen angeben kann. Perfekt
damit wäre das jetzt gelöst.

Danke und Gruß
Önder

Am 28.10.2007 um 11:26 schrieb Moritz H.:

ja hallo erstmal,…

Am Freitag, 26. Oktober 2007 schrieb Jan L.:

  html_options[:confirm]= "Leaving page - input will be lost."
end
super(name, options,html_options,*parameters_for_method_reference)

end

Das funktionierte soweit ganz gut. Nun würde ich jedoch gerne statt der
Standard-confirm-Funktion eine eigene verwenden. (Um gemachte Änderungen

Für die, die eine Lösung interessiert:
Es muss im application_helper zusätzlich die Methode
def_confirm_javascript_function(confirm) überladen werden - Rückgabewert ist
der auszuführende JavaScript-Code…

Keep smiling
yanosz