2017-07-13 9 views
0

いくつかの要件(製品所有者による)のために、私は黄金のパスから逸脱し、制約に一致するいくつかの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はとそのルートをリロードすること

+0

もっとRESTfulなアプローチを選択しないのはなぜ?それはあなたの問題のすべてを解決します。これが不可能な場合は、非整数パラメータとのみ一致する制約を導入することができます。そのため、データベースのすべてのスラッグと比較する必要はありません。 – zwippie

+0

はい、そうですが、製品の所有者は別のURLを求めています。マッチする非整数パラメータは、投稿にもスラッグがあり、いくつかのカテゴリが数字で始まるため、オプションではありません。 –

+0

私は制約をクラスに変換しようとしましたが、これで問題が回避されました。 –

答えて

1

を要求することができます。

+0

ありがとう、実際に私はルートをテストすることができました。 –

+0

恐ろしい。これで、スタックオーバーフローのモデレータ(!)になったばかりです。https://www.dropbox.com/s/l8doas52ghhrj7f/Screenshot%202017-07-16%2021.44.06.png?dl=0 – stef

+0

:)あなたが何とかあなたの最初のゴールデンバッジを得るまで待ってください。 –

1

このアプローチ(ActiveRecordモデルからのデータを使用してルーティング構成に制約をかける)には重大な欠点があります。それを正しくテストすることはほとんど不可能であるだけでなく、制約を再構築するために、カテゴリが変更されるたびにアプリケーションを再起動する必要があります。

ロジックをコントローラアクションに移動することをお勧めします。あなたはそれのための小さなパフォーマンスの代価を払う(ポストをレンダリングするときに追加のデータベースクエリ)が、それは間違いなく価値がある。必要に応じてカテゴリのクエリキャッシュを導入することで軽減できます。

ルーティング:

Rails.application.routes.draw do 
    resources :posts 
end 

はコントローラー: `/カテゴリ/::ナメクジ/ posts`

class PostsController < ActionController::Base 
    def show 
    category = Category.find_by_slug params[:id] 
    if category 
     # ... render a Category 

     return 
    end 

    post = Post.find_by_slug params[:id] 
    # ... render a Post 
    end 
関連する問題