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,一个控制器

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 回答
-1

您可以尝试创建一个方法,该方法使用String.subString.sub!(后者在内存中就地修改 String 对象)来临时更改路由的实际值,或者根据需要更改。

于 2013-09-03T08:12:52.280 回答