Flex mit Ruby on Rails + authlogic authenitifizieren
Bei meinem aktuellen Rails Projekt loggen sich die Benutzer per authlogic auf der Seite ein, alles über Rails. Da jedoch ein Teil der Seite mit einer Flex App realisiert wird, musste ich das Zusammenspiel zwischen Rails und Flex ein wenig erforschen.
Mein erster Blick fiel auf WebORB mit dem passenden Flex Plugin indem man sehr einfach die einzelnen Modells und somit die Datenbank ansprechen kann. (http://sujitreddyg.wordpress.com/2009/10/13/ruby-on-rails-extension-for-flash-builder-4/)
Hier habe ich zwar Zugriff auf das UserSession-Modell von authlogic, jedoch nicht auf die aktuelle Session und somit die eingeloggten User. Die Cookies und Sessions werden erst im UserSessionsController festgelegt.
Um nun in der Flex Anwendung zu wissen "Ist der User eingeloggt" und wenn ja "Welcher User bist du denn?" erweitert man den UserSessions Controller um folgende Methode:
def checkLogin
if logged_in?
xml = "
<usersessions>
<login>true</login>
<currentid>#{current_user_session.user.id}</currentid>
</usersessions>"
else
xml = "
<usersessions>
<login>false</login>
<currentid>false</currentid>
</usersessions>"
end
respond_to do |format|
format.xml { render : xml => xml }
end
end
Hiermit stellen wir eine Methode bereit die uns ein XML File rendert das sagt, bin ich eingeloggt, oder nicht (über das Format der XML ließe sich streiten).
In der Flex App kreiert man nun einen HTTP-Service, der auf die URL der Methode verweist, und bei erfolgreichem Result das ganze als XML ausgibt.
<fx:Script>
<![CDATA[
import mx.rpc.events.ResultEvent;
public function switchStates(event:ResultEvent):void {
var xml:XML = event.result as XML;
var loggedInP:Boolean = xml.login as Boolean;
var currentID:int = xml.currentid;
trace(currentID);
}
]]>
</fx:Script>
<fx:Declarations>
<s:HTTPService resultFormat="e4x" id="login" url="http://localhost:3000/user_sessions/checkLogin" result="switchStates(event)" fault="trace('fault');"/>
</fx:Declarations>
Natürlich muss im Application tag noch
creationComplete="login.send()
gesetzt werden. Und schon hat man zwei Variablen, die den User authentifizieren.
Gravata für Ruby on Rails
Hier gefunden: http://overhrd.com/?p=28
Um Gravatar für Ruby on Rails zu verwenden, ist lediglich eine kleine Methode im Application Helper nötig und deren Aufruf in der View.
application_helper.rb
require 'digest/md5'
def gravatar_url_for(email, options = {})
url_for({ :gravatar_id => Digest::MD5.hexdigest(email),
:host => 'www.gravatar.com',
:protocol => 'http://',
nly_path => false,
:controller => 'avatar.php'}.merge(options))
end
View (z. B. index.html.erb)
# plain old gravatar url
<%= gravatar_url_for 'info@sketchit.de' %>
# gravatar url with a rating threshold
<%= gravatar_url_for 'info@sketchit.de', { :rating => 'R' } %>
# show the avatar
<%= image_tag(gravatar_url_for 'info@sketchit.de') %>
# show the avatar with size specified, in case it's served slowly
<%= image_tag(gravatar_url_for('info@sketchit.de'), { :width => 80, :height => 80 }) %>
# link the avatar to some/url
<%= link_to(image_tag(gravatar_url_for 'info@sketchit.de'), 'some/url')%>
Die oben definierte Methode nimmt die übergebene E-Mail Adresse, wandelt es in einen MD5 Hash um, baut daraus die URL von Gravatar zusammen (http://www.gravatar.com/avatar.php?gravatar_id=HASH_WERT) und liefert den Avatar zurück.