Aufgrund einiger Anforderungen (durch den Product Owner) muss ich vom goldenen Pfad abweichen und überschreiben Sie eine Ressource Route für einige URLs, die eine Einschränkung entsprechen.Müssen einige Code (Einfügen in DB) vor Minitest-Route testen
Rails.application.routes.draw do
CATEGORY_SLUGS = Regexp.new(Category.all.collect(&:slug).join('|'))
get '/posts/:category', to: 'posts#index', as: :category_posts, constraints: { category: CATEGORY_SLUGS }
resources :posts
end
und mein Test:
require 'test_helper'
class PotsControllerTest < ActionDispatch::IntegrationTest
# routes
test "/posts/:category" do
Fabricate(:category, slug: 'rails')
assert_recognizes({controller: 'posts', action: 'index', category: 'rails' }, 'posts/rails')
end
Der Test schlägt fehl offenbar, weil die Strecken lange vor Beginn der Prüfung gezogen werden und die Category
existiert noch nicht an diesem Punkt.
Gibt es eine gute Alternative zu der CATEGORY_SLUGS
oder irgendetwas im Test zeichnen die Routen später?
Warum die mehr RESTful Ansatz nicht wählen: '/ categories /: Slug/posts'? Das würde all deine Probleme lösen. Wenn dies nicht möglich ist, können Sie möglicherweise eine Integritätsbedingung einführen, die nur Nicht-Ganzzahl-Parameter erfüllt, sodass Sie nicht mit allen Elementen aus der Datenbank vergleichen müssen. – zwippie
Ja, würde es, aber der Product Owner will verschiedene URLs. Nicht-Integer-Params zu finden, ist auch keine Option, da die Posts auch Slugs haben und einige Kategorien mit Zahlen beginnen. –
Ich habe versucht, die Einschränkung in eine Klasse umzuwandeln, aber das hat das Problem nur verschoben. –