いくつかの要件(製品所有者による)のために、私は黄金のパスから逸脱し、制約に一致するいくつかのURLのリソースルートを上書きする必要があります。minitestルートテストの前にいくつかのコードを実行する必要があります
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
と私のテスト:ルートは、試験開始前に長く描かれており、Category
は、その時点ではまだ存在しないため、テストは明らかに失敗した
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
。
CATEGORY_SLUGS
の代替手段はありますか、またはテストで何か後で経路を描くのですか?これは、ダイナミックルートが先にあなたのassert_recognizes
コールの生成されていることを確認する必要があります
Rails.application.reload_routes!
:この場合Fabricate
コールを使用してテスト・セットアップしたら、Railsはとそのルートをリロードすること
もっとRESTfulなアプローチを選択しないのはなぜ?それはあなたの問題のすべてを解決します。これが不可能な場合は、非整数パラメータとのみ一致する制約を導入することができます。そのため、データベースのすべてのスラッグと比較する必要はありません。 – zwippie
はい、そうですが、製品の所有者は別のURLを求めています。マッチする非整数パラメータは、投稿にもスラッグがあり、いくつかのカテゴリが数字で始まるため、オプションではありません。 –
私は制約をクラスに変換しようとしましたが、これで問題が回避されました。 –