0

これを解決するためのきれいな方法で少し苦労しています。

これらのモデルのようなものがあると仮定しましょう:

class Article
end

class FooArticle < Article
end

class BarArticle < Article
end

現在、FooArticle と BarArticle の特別なルート セットはありません。どちらも/articlesアプリで処理されます。

だから私は通常 article_path(@article) または new_article_path などを行います..

ルートを明示的に定義したくない共有パーシャルの場合を除いて、これはすべて正常に機能します。

form_for(@article) do |f|
  ...
end

foo_article_path上記は解決できないため、不明なルート エラーが発生しbar_article_pathます@article = Article.new

質問は次のとおりです。パス引数を切り替えるメソッドがあるので、このコードを記述する必要はありません。

url = @article.persisted? ? article_path(@article) : articles_path

私は明示的にルーターのポリモーフィック マジックを使用したくありませんが、そこで行われているアクションの自動検出の恩恵を受けています。

4

3 に答える 3

3

これを試してください:

Article.subclasses.each do |sub_class|
  resources sub_class.underscore.to_sym, :controller => "articles", :type => sub_class.to_s
end

underscore is ActiveSupport's method

resources :articles

詳細については、これをお読みください

STI、コントローラー1個

class Article
  def self.subclasses
    @subclasses ||= []
  end

  def self.inherited(klass)
    @subclasses ||= []
    @subclasses << klass
  end

end
于 2013-09-03T08:41:50.330 に答える
0

子クラスに model_name メソッドを設定することでこれを行う方法があるかもしれません: Rails 3 polymorphic_path - how to change the default route_key

ただし、副作用の可能性が心配なので、独自のヘルパーを作成します。

def form_for_article(record, options = {}, &block)  
  options.reverse_merge!({:url => record.persisted? ? article_path(record) : articles_path})
  form_for(record, options, &block)
end

必要に応じてこれを一般化して、path_prefix を渡すこともできますが、それはやり過ぎかもしれません。

于 2013-09-03T08:51:55.953 に答える