1

それで一口です。

あなたが自動車メーカーで、ウェブアプリを必要としているとしましょう。その webapp の一部は、デザイナーが共同でデザインを行うために使用されます。車、トラック、SUV などを設計しています。この更新を継承し、以前の開発者が設計パターンとして単一テーブルの継承を使用することにしたとしましょう。あなたは STI を読み、使用されたデザイン パターンが正しいものであることに同意しますが、実質的に同一であるため、一連のコントローラーとビューをリファクタリングしたいと考えています。

継承したモデルは次のようになります。

class Design < ActiveRecord::Base
class DesignVersion < ActiveRecord::Base

class DesignCar < Design
class DesignCarVersion < DesignVersion

SUV およびトラック デザイン / デザイン バージョンのモデルは、ここで自動車用に配置されたのと同じパターンに従うと仮定します。また、アプリケーションが動作するため、適切な関係が設定されていると仮定します。DRY しようとしている冗長なコードがいくつかあるだけです。

最初は、車、車のデザイン、トラック、トラックのデザインなどのそれぞれにコントローラーを用意することから始めました。そのため、STI を 1 つのコントローラーで読み、STI のルーティングを調べました。その結果、Designs および DesignVersions コントローラーを作成し (Design および DesignVersion ベース モデルと一致させるため)、ルートで次のようなものを作成します。

resources :cars, :controller => "designs", :type => 'DesignCar' do
  resources :car_versions, :controller => "design_versions", :type => 'DesignCarVersion'
    member do
      post 'approve'
      #various other things besides new, show, etc
    end
  end
end

これは、new_design_car_car_versions_path、approve_design_car_car_versions_path などのルートを生成するのに役立ちます。トラックと SUV についても同じことを行うと仮定します。レーキ ルートを実行し、ルートを確認します。ルートは、ちょうど実行していたときのルートと同じです。

resources :cars
  resources :car_versions
    member do
      post 'approve'
    end
  end
end

だからすべてがよさそうだ。デザインを一覧表示するだけの非常に基本的なビューを作成し (つまり、/cars に移動すると、車のデザインのみが表示されます)、/cars、/truck などを見るとすべてが適切に表示されます。表示されるのは、特定のタイプのデザインだけです。 . 次に、古い _paths を追加し、それらを特定ではなく汎用にリファクタリングし始めます。

問題ありません。polymorphic_path を使用します。

そして、ここで私の問題にぶつかりました。

config/routes.rb から生成されたルートは、approve_design_car_car_versions_path として生成されます。同等の polymorphic_path は、approve_design_car_design_car_versions_path として生成されます。/cars のページ (各デザインをリストし、その下に、デザインの特定のバージョンへのリンクを含むさまざまなバージョンに関するデータ) を表示しようとすると、予想どおり、「approve_design_car_design_car_versions_path」が存在。

また、DesignCar と DesignCarVersion はモデル名としてはぎこちなく見えますが、Web アプリケーションの別の部分に Car モデルもあるとします。その結果、差別化を余儀なくされました。この例では、CarDesign と CarDesignVersion の方が理にかなっているかもしれませんが、これをモデル化している問題では、実際に持っているもの (ここでは DesignCar に置き換えています) の方が理にかなっています。

私が試したこと:

たくさんの読書。最初は、polymorphic_url は自分が望んでいたものではないのではないかと考えたので、STI のルートを生成する方法を一生懸命調べました。残念ながら、私が見つけた答えのほとんどには、:type が含まれていないか、私が持っているようにネストされたルートが含まれていませんでした。

それから、私は実際に STI からポリモーフィズムに変更したいのではないかと考えました。古い Rails Cast を見たり、読んだりしましたが、STI が本当に正しいという結論に達しました。

次に、「まあ、ルートの名前をポリモーフィックが生成するものに指定するだけでうまくいくはずだ」と思ったので、次のようなことをしました:

resources :cars, :controller => "designs", :type => 'DesignCar' do
  resources :car_versions, :controller => "design_versions", :type => 'DesignCarVersion'
    member do
      post 'approve', :as => 'approve_design_car_car_versions'
    end
  end
end

レーキ ルートを作成すると、「approve_design_car_car_versions_design_car_versions」になりました。

では、生成されるルートが、car と car_version を渡したときに生成される polymorphic_path と一致するようにするには、どうすればよいでしょうか? polymorphic_path を使用しませんか? ルートを修正しますか? 多くの重複が発生するにもかかわらず、すべての子のコントローラーに戻りますか?

モデル名を返す polymorphic_path のモデルへのリフレクションと関係があるのではないかと思います。ルート生成のために行われているのは、何らかの理由で何か他のものを返すことです。ただし、これがバグではない場合の理由に困惑しています(これはバグではなく、何か間違ったことをしているだけだと思います)または、本来あるべきキー値がありませんどこかを通り過ぎます。私はまだレールに比較的慣れていないので、エラーはおそらく私にあると思います(現在〜1.5年)。

よろしくお願いいたします。

4

1 に答える 1