Die Programmiersprache Ruby

Blog|

Forum|

Wiki  


Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]

Ein neues Thema erstellen Auf das Thema antworten  [ 14 Beiträge ] 
Autor Nachricht
BeitragVerfasst: 27 Jun 2014, 18:56 
Offline
Interpreter
Benutzeravatar

Registriert: 18 Sep 2008, 22:32
Beiträge: 1821
Wohnort: NRW → UN
Hallo Community,

seit grauer Vorzeit empfiehlt der Padrino-Guide für Application Helpers die Einbindung der Unubtrusive Javascript Helpers. Das lief bisher so, dass man sich für sein jeweiliges JavaScript-Framework den passenden Padrino-Adapter von hier herunterlud, in sein public/javascripts/-Verzeichnis packte und anschließend per




<%= javascript_include_tag 'framework', 'framework-ujs' %>


einband. Da ich längere Zeit nicht mehr mit Padrino gearbeitet hatte, unterlief mir nun der Fehler, dass ich diese UJS-Sachen komplett vergessen hatte. Umso erstaunter war ich, als ich feststellte, dass Links nach der Art




<%= link_to "foo", url(:foo, :bar), :method => :patch %>


auch ohne die UJS-Helper problemlos funktionierten. Bisher war dazu meines Wissens nach immer etwas JavaScript erforderlich, um die störrischen Browser dazu zu bewegen, die korrekte HTTP-Methode abzusetzen. Sind Browser plötzlich umgänglicher geworden? Setzt Padrino irgendeine Rack-Middleware ein, um den Effekt auch ohne JavaScript zu erreichen?

Und vor allen Dingen: Werden die UJS-Helpers für diesen Einsatz (HTTP-Methoden angeben) jetzt überhaupt noch gebraucht?

Valete,
Quintus

_________________
Habe den Mut, dich deines eigenen Verstandes zu bedienen! — Immanuel Kant

Ich bin freischaffender Softwareentwickler und freue mich über jedes neue Projekt. Kontaktinformation auf meiner Website.

Mein Blog | GitHub-Profil | Auf Twitter: @qquintilianus | PGP/GPG-Schlüssel: B1FE 958E D5E8 468E AA20 8F4B F1D8 799F BCC8 BC4F


Nach oben
 Profil  
 
BeitragVerfasst: 30 Jun 2014, 12:35 
Offline
Interpreter

Registriert: 10 Dez 2007, 17:37
Beiträge: 1906
Nö die Browser können das nicht. Rails erkennt anhand der method patch, das ein Data-Attribue gesetzt werden muss. Den rest macht Rails/jQuery ujs. Das ist ja per default geladen.

_________________
Grüße
Jack


Nach oben
 Profil  
 
BeitragVerfasst: 30 Jun 2014, 15:09 
Offline
Interpreter
Benutzeravatar

Registriert: 18 Sep 2008, 22:32
Beiträge: 1821
Wohnort: NRW → UN
slowjack2k hat geschrieben:
Rails erkennt anhand der method patch


Ähm, du hast aber schon gelesen, dass ich nicht Rails verwende, sondern Padrino?

Da ist nämlich das hier:

slowjack2k hat geschrieben:
Das ist ja per default geladen.


nicht der Fall.

Vale,
Quintus

_________________
Habe den Mut, dich deines eigenen Verstandes zu bedienen! — Immanuel Kant

Ich bin freischaffender Softwareentwickler und freue mich über jedes neue Projekt. Kontaktinformation auf meiner Website.

Mein Blog | GitHub-Profil | Auf Twitter: @qquintilianus | PGP/GPG-Schlüssel: B1FE 958E D5E8 468E AA20 8F4B F1D8 799F BCC8 BC4F


Nach oben
 Profil  
 
BeitragVerfasst: 30 Jun 2014, 15:16 
Offline
Interpreter

Registriert: 10 Dez 2007, 17:37
Beiträge: 1906
Ich habe Padrino gelsen, ja. Da die Syntax aber wie Rails aussieht, bin ich davon ausgegangen,
dass Patrino ein Plugin für Rails ist. My fault.

_________________
Grüße
Jack


Nach oben
 Profil  
 
BeitragVerfasst: 30 Jun 2014, 16:22 
Offline
Interpreter
Benutzeravatar

Registriert: 18 Sep 2008, 22:32
Beiträge: 1821
Wohnort: NRW → UN
slowjack2k hat geschrieben:
dass Patrino ein Plugin für Rails ist. My fault.


Skade muss dringend mehr Werbung machen :-P

=> http://www.padrinorb.com

Das Problem hat sich erledigt. Ich bin mir zwar nicht wirklich sicher, wie ich diesen Effekt zustandegebracht habe, aber ich bin nicht mehr in der Lage, das zu reproduzieren. Skade verwies mich im #ruby-portal-IRC-Channel darauf, dass solche Links grundsätzlich nur mit UJS-Helper funktionieren. Eine Alternative ist das Anhängen der Methode als Query-Parameter, was von der von Padrino verwendeten Rack-Middleware MethodOverride ausgewertet wird. So käme man auch ohne JavaScript aus.

Vale,
Quintus

_________________
Habe den Mut, dich deines eigenen Verstandes zu bedienen! — Immanuel Kant

Ich bin freischaffender Softwareentwickler und freue mich über jedes neue Projekt. Kontaktinformation auf meiner Website.

Mein Blog | GitHub-Profil | Auf Twitter: @qquintilianus | PGP/GPG-Schlüssel: B1FE 958E D5E8 468E AA20 8F4B F1D8 799F BCC8 BC4F


Nach oben
 Profil  
 
BeitragVerfasst: 30 Jun 2014, 17:45 
Offline
Interpreter

Registriert: 10 Dez 2007, 17:37
Beiträge: 1906
Quintus hat geschrieben:

Skade muss dringend mehr Werbung machen :-P



scheint wohl so, lotus hat's zumindest auf heise
geschafft, ohne was zu können.

Quintus hat geschrieben:

Eine Alternative ist das Anhängen der Methode als Query-Parameter, was von der von Padrino verwendeten Rack-Middleware MethodOverride ausgewertet wird. So käme man auch ohne JavaScript aus.


klingt gefährlich. javascript schickt diese links ja als post ab, statt get.
wenn es einfach ein link ist, dann würde eine crawler dem kompletten link folgen
und z.b. datensätz löschen.

_________________
Grüße
Jack


Nach oben
 Profil  
 
BeitragVerfasst: 30 Jun 2014, 17:53 
Offline
Interpreter
Benutzeravatar

Registriert: 18 Sep 2008, 22:32
Beiträge: 1821
Wohnort: NRW → UN
slowjack2k hat geschrieben:
wenn es einfach ein link ist, dann würde eine crawler dem kompletten link folgen
und z.b. datensätz löschen.


Naja, Authentifizierung und so musst du ja im Controller immer noch prüfen. Nur eine andere HTTP-Methode statt GET oder POST zu verwenden statt ordentlicher Authentizifierung wird wohl kaum als Sicherheitsmaßnahme anzusehen sein.

Vale,
Quintus

_________________
Habe den Mut, dich deines eigenen Verstandes zu bedienen! — Immanuel Kant

Ich bin freischaffender Softwareentwickler und freue mich über jedes neue Projekt. Kontaktinformation auf meiner Website.

Mein Blog | GitHub-Profil | Auf Twitter: @qquintilianus | PGP/GPG-Schlüssel: B1FE 958E D5E8 468E AA20 8F4B F1D8 799F BCC8 BC4F


Nach oben
 Profil  
 
BeitragVerfasst: 30 Jun 2014, 18:04 
Offline
Interpreter

Registriert: 10 Dez 2007, 17:37
Beiträge: 1906
Das war nur ein Beispiel. 9.1.1 Safe Methods das würde damit verletzt. Das hat nichts mit Authentifizierung zu tun. Ein Beispiel (zwar nicht so gut aber egal) etwas in den Warenkorb legen oder löschen. Dadurch werden Artikel (z.B. rare Artikel) reserviert. Wäre blöd wenn das ein Crawler macht. Und es gibt noch bessere Beispiele, die mir leider gerade nicht einfallen.

_________________
Grüße
Jack


Nach oben
 Profil  
 
BeitragVerfasst: 30 Jun 2014, 18:10 
Offline
Interpreter
Benutzeravatar

Registriert: 18 Sep 2008, 22:32
Beiträge: 1821
Wohnort: NRW → UN
Das Problem ist halt, dass Browser (ohne AJAX) nur GET oder POST machen, da können W3C, IETF & Co. so viel spezifizieren, wie sie wollen. Wenn ich will, dass meine Seite ohne JavaScript funktioniert, dann kann ich noch froh sein, wenn ich wenigstens auf Ebene meiner Anwendung noch ordentliches REST sehe. Ich bin bereit, Query Parameters nie wieder zu verwenden, wenn endlich die Webbrowser gefixt werden.

Vale,
Quintus

_________________
Habe den Mut, dich deines eigenen Verstandes zu bedienen! — Immanuel Kant

Ich bin freischaffender Softwareentwickler und freue mich über jedes neue Projekt. Kontaktinformation auf meiner Website.

Mein Blog | GitHub-Profil | Auf Twitter: @qquintilianus | PGP/GPG-Schlüssel: B1FE 958E D5E8 468E AA20 8F4B F1D8 799F BCC8 BC4F


Nach oben
 Profil  
 
BeitragVerfasst: 30 Jun 2014, 18:17 
Offline
Interpreter

Registriert: 10 Dez 2007, 17:37
Beiträge: 1906
Quintus hat geschrieben:
Das Problem ist halt, dass Browser (ohne AJAX) nur GET oder POST machen


Jep, dementsprechend sollte es dann ein Formular/POST und kein Link sein, für alles was nicht "safe" ist.

_________________
Grüße
Jack


Nach oben
 Profil  
 
BeitragVerfasst: 30 Jun 2014, 18:24 
Offline
Interpreter
Benutzeravatar

Registriert: 18 Sep 2008, 22:32
Beiträge: 1821
Wohnort: NRW → UN
slowjack2k hat geschrieben:
Quintus hat geschrieben:
Das Problem ist halt, dass Browser (ohne AJAX) nur GET oder POST machen


Jep, dementsprechend sollte es dann ein Formular/POST und kein Link sein, für alles was nicht "safe" ist.


Das ist dann aber auch kein ordentliches REST. Wenn ich z.B. etwas löschen will, dann muss ein DELETE rausgeschickt werden, kein POST. Mit deiner Methode wäre ich gezwungen, in meinen Controllern nur noch GET und POST zu verwenden, was gutem Websoftware-Design zuwider läuft.

Vale,
Quintus

_________________
Habe den Mut, dich deines eigenen Verstandes zu bedienen! — Immanuel Kant

Ich bin freischaffender Softwareentwickler und freue mich über jedes neue Projekt. Kontaktinformation auf meiner Website.

Mein Blog | GitHub-Profil | Auf Twitter: @qquintilianus | PGP/GPG-Schlüssel: B1FE 958E D5E8 468E AA20 8F4B F1D8 799F BCC8 BC4F


Nach oben
 Profil  
 
BeitragVerfasst: 30 Jun 2014, 18:58 
Offline
Interpreter

Registriert: 10 Dez 2007, 17:37
Beiträge: 1906
Zur Zeit wird es aber genau so gemacht in rails. Alles außer get ist ein post mit einem hidden field das patch und co als wert enthält. Der js code erzeugt auch nur ein hidden Form für einen link.

_________________
Grüße
Jack


Nach oben
 Profil  
 
BeitragVerfasst: 30 Jun 2014, 21:49 
Offline
Interpreter
Benutzeravatar

Registriert: 18 Sep 2008, 22:32
Beiträge: 1821
Wohnort: NRW → UN
slowjack2k hat geschrieben:
Zur Zeit wird es aber genau so gemacht in rails. Alles außer get ist ein post mit einem hidden field das patch und co als wert enthält. Der js code erzeugt auch nur ein hidden Form für einen link.


Ich habe gerade mal getestet. Rails erzeugt bei einem




<p><%= link_to "test", "http://example.org", :method => :delete %></p>


folgendes HTML:




<p><a data-method="delete" href="http://example.org" rel="nofollow">test</a></p>


(dieses Vorgehen wird so in den Rails Guides vorgeschlagen)

Wenn ich deine Erläuterungen richtig verstehe, dann fängt Rails’ JavaScript das Aktivierungsevent des Links ab, baut ein Formular mit POST ein (plus hidden field für die Methode), und schickt dann das Formular ab? Wow. Ich dachte immer, das macht einfach ein einfaches AJAX-Request, weil JavaScript kann ja auch andere HTTP-Methoden als GET und POST erzwingen.

Das verlagert dann aber den Verantwortungsbereich. Für die Implementation von link_to bin nicht ich, sondern mein Framework zuständig, einschließlich des für seine korrekte Funktion erforderlichen JavaScripts.

Vale,
Quintus

_________________
Habe den Mut, dich deines eigenen Verstandes zu bedienen! — Immanuel Kant

Ich bin freischaffender Softwareentwickler und freue mich über jedes neue Projekt. Kontaktinformation auf meiner Website.

Mein Blog | GitHub-Profil | Auf Twitter: @qquintilianus | PGP/GPG-Schlüssel: B1FE 958E D5E8 468E AA20 8F4B F1D8 799F BCC8 BC4F


Nach oben
 Profil  
 
BeitragVerfasst: 30 Jun 2014, 22:57 
Offline
Interpreter

Registriert: 10 Dez 2007, 17:37
Beiträge: 1906
Jep, hier wird das formular erzeugt.
Und hierwird der delegate auf das data-method attribute fest gelegt.

Und genau, für JS macht das framework das richtige für dich. Ohne JS solltest du halt die spielregeln einhalten und alles auser GET mit einem POST versenden. My 2 cents.

_________________
Grüße
Jack


Nach oben
 Profil  
 
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 14 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach: