Pagy-Gem für Paginierung

Seit Jahren verwende ich privat wie beruflich will_paginate. Da es stets gute Dienste leistete habe ich dies auch nie hinterfragt und bin nur durch die mangelnde Weiterentwicklung und Limitation-Warnung auf pagy gestoßen. Dieses punktet nicht mit Bescheidenheit, sondern mit den folgenden Aussagen: ~ 40x Faster!~ 36x Lighter!~ 35x Simpler!~ 1,410x More Efficient! Der Ansatz ist… Pagy-Gem für Paginierung weiterlesen

Vollständige Dependent-Einstellungen in Rails-Models testen

Ein selten, aber leider regelmäßig wiederkehrendes Problem sind Fremdschlüsselbeziehungen beim Löschen. In Rails muss auf Seite des Schlüsselziels definiert werden, ob ein Fremdschlüssel auf null gesetzt werden darf oder ob das ganze Model gelöscht werden muss. Vergisst man diese Konfiguration wirft die Datenbank beim Löschen einen Fehler. Um dies zu vermeiden möchte ich alle Fremdschlüssel,… Vollständige Dependent-Einstellungen in Rails-Models testen weiterlesen

Verwischte Font-Awesome-Icons in Phantom JS

Wir reichern unsere auf Capybara und Phantom JS basierenden Feature-Tests gerne mit Screenshots an. Hierbei kam es regelmäßig zu einem Problem mit Font Awesome, wodurch der automatische Abgleich fehl schlug. Bei einzelnen Specs tritt das Problem nicht auf, erst wenn mehrere Tests mit unterschiedlichen Seiten abgelichtet werden zeigte sich folgendes Phänomen: Alle Icons, wie hier das Such-Icon rechts,… Verwischte Font-Awesome-Icons in Phantom JS weiterlesen

Herausfinden, wo eine Methode definiert wurde

In manchen Situationen ist es alles andere als offensichtlich, welche Klasse oder welches Modul eine Methode bereitstellt. Wer implementiert die Get-Methode für Rspec-Controller-Tests? Gerade in solch zusammengewürfelten Umgebungen ist das nur schwer nachvollziehbar. Ruby hilft hierbei: Die Metamethode method gibt Auskunft, woher eine Methodendefinition stammt: require „rails_helper“ RSpec.describe MyController do it do puts method(:get) end end… Herausfinden, wo eine Methode definiert wurde weiterlesen

Rails-Konfiguration in Engine auslagern

Für die meisten Rails-Projekte verwende ich die gleichen Gems mit ähnlichen Konfigurationen. Um den Projektstart und den Update-Prozess zu vereinheitlichen, möchte ich eine Engine, die diese Abhängigkeiten und Konfigurationen übernimmt. Für den einfacheren Einstieg erzeuge ich innerhalb einer bestehenden Rails-App eine neue Engine: rails plugin new m3 –full Diese wird zu Testzwecken im Gemfile des Elternprojekts verlinkt: gem… Rails-Konfiguration in Engine auslagern weiterlesen

Bundler überspringt Gems mit Todo-Beschreibung

Komisches Verhalten von Bundler, welches bei mir vorher nie aufkam: $ bundle install … Source does not contain any versions of ‚gem (>= 0) ruby‘ Das Problem scheint hier tatsächlich zu sein, dass die Gem-Spezifikation noch Todos enthält: Gem::Specification.new do |s| # … s.summary = „TODO: Summary of Gem.“ s.description = „TODO: Description of Gem.“… Bundler überspringt Gems mit Todo-Beschreibung weiterlesen

Match API output with YAML fixture

A nice and simple approach to test you JSON APIs: # spec/features/api/user_spec.rb require ‚rails_helper‘ RSpec.feature ‚User‘, type: :feature do it ‚lists users‘ do user = create(:user, :as_admin) visit api_user_path(user, format: :json) expect(page).to match_yaml_fixture(‚api/user‘) end end This checks if the page source matches the data given in the fixture file. To make it more readable we format… Match API output with YAML fixture weiterlesen

Overwriting and Overriding with define_method

Recently we stumbled upon this inheritance issue, which seemed very weird at the first: class A def talk ‚A‘ end end class B < A def self.define_talk define_method :talk do super() << ‚B‘ end end end class C < B define_talk def talk super << ‚C‘ end end > C.new.talk => „AC“ The talk addition from class… Overwriting and Overriding with define_method weiterlesen