PicoJournal – Devise Gem: Leicht und Schwer gleichzeitig

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.

pfeildings

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 🙂

20160617_121626
Noch ungestyled
20160617_121638
Funktionierende Links, die wechseln, je nach Login-Status. Plus kleine automatische Devise Notiz
20160617_121659
Die wahnsinnig hässliche, aber funktionale Days Seite!

 

pfeildings

Nächstes Mal muss ich mich wohl noch etwas mehr in Devise einlesen. Bis dahin!

*geht Bier für BFF und BGFF kaufen :p*