Was für einen Fortschritt kann ich heute in den Paar Stunden erzielen? Ich habe zwar letztes Mal Devise zum laufen gebracht und da dieses Plugin so einiges einfach von selbst einrichtet, kam ich relativ schnell zu einem Ergebnis. Nur habe ich nicht wirklich verstanden was eigentlich passiert ist und es stellt sich heraus, das viele Leute dieses Problem mit Devise haben. Will man nur Default Einstellungen haben, klappt alles ganz gut. Will man was Spezielleres, sollte man genau verstehen was Devise tut und was man selbst tut.
So weit, dass ich alles in Devise verstehe bin ich nicht gekommen. Ich habe jedoch einige Dinge herausgefunden und damit ein Paar Verbesserungen vornehmen können.
1. Nutzbare Links
Die Links zur Signup und Login Page sind in Rails speziell. Dieser Schnipsel zeigt einen Logout Link wenn man eingeloggt ist. Ansonsten zeigt er einen Login und Signup Link.
<ul class="nav navbar-nav navbar-right"> <% if user_signed_in? %> <li><%= link_to 'Logout', destroy_user_session_path, method: :delete %></li> <% else %> <li><%= link_to 'Login', new_user_session_path %></li> <li><%= link_to 'Sign up', new_user_registration_path %></li> <% end %> </ul>
2. Layouts
Damit habe ich noch nicht allzu viel Zeit verbracht. In meinem Layout befindet sich jetzt der head tag, und alle anderen HTML Dokumente werden vom Layout umschlossen und erhalten somit den immer gleichen head tag.
Außerdem habe ich hier noch diese Zeile hinzugefügt, welche wohl JS hinzufügt. Ohne die kamen ständig Fehler.
<%= javascript_include_tag 'application' %>
3. „Sie sind eingeloggt!“
Auf den Seiten taucht automatisch eine kleine Nachricht von Devise auf, wenn man diese zwei p tags einfügt. Ich hab sie mal schnell und hässlich gestyled.
<p style="position:absolute; background-color: none; z-index:1; right:20px;" class="notice"><%= notice %></p> <p style="position:absolute; background-color: none; z-index:1; right:20px;" class="alert"><%= alert %></p>
4. Tage für User
Loggt man sich ein kann man jetzt einen Post erstellen! Das lässt sich ja ganz einfach generieren, wenn man jetzt aber noch User zu bestimmten Posts zuordnen will, bedarf es etwas mehr Aufwand. Dafür muss man im Model von day und user eine kleine Zeile, mit has_many und belongs_to, hinzufügen.
class Day < ActiveRecord::Base belongs_to :user end
class User < ActiveRecord::Base # Include default devise modules. Others available are: # :confirmable, :lockable, :timeoutable and :omniauthable devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable has_many :days end
Um den Tag nun mit dem User identifizieren zu können, bekommt dieser nun noch eine ID. Dafür gibt man folgenden Befehl in die Konsole ein.
rails generate migration add_user_id_to_days user_id:integer
Reicht immer noch nicht. Jetzt noch ein Blick in den days_controller. Da muss die new und create Methode geändert werden.
def new # war davor Days.new @day = current_user.days.build end # GET /days/1/edit def edit end # POST /days # POST /days.json def create @day = current_user.days.build(day_params) # [...]
Server neu starten und dann gehts bei mir!
5. Seiten nur für eingeloggte User
Ich will dass nur eingeloggte user zu den Days kommen. Dafür kann man im DaysController ganz oben diese Zeile adden. Scheint bei mir aber irgendwie noch nicht ganz zu finktionieren…muss ich mir fürs nächste Mal merken.
before_action :authenticate_user!
Um die Daten des momentanen Users herauszufinden nimmt man den current_user.irgendwas Befehl.
<h2>Welcome user with email: <%= current_user.email %>!</h2>
6- Nach dem Login weiterleiten
Wenn man sich einloggt will ich gleich auf der Days Seite landen. Solche Probleme sind es, die ich bei Devise nicht ohne Google lösen kann. Die Lösung ist diese Methode im application controller
def after_sign_in_path_for(resource) days_url end
7. Ergebnis
Zum Schluss noch ein Paar hässliche Handyscreenshots, da meine virtuelle Maschine nur schwarze Screenshots macht…
Das Ergebnis ist eine Homepage mit funktionierenden Signup/Signin Links, einer Weiterleitung auf die Days Seite, auf der man einen rudimentären Tag anlegen, editieren und löschen kann 🙂
Nächstes Mal muss ich mich wohl noch etwas mehr in Devise einlesen. Bis dahin!
*geht Bier für BFF und BGFF kaufen :p*