我正在努力用干净的方式解决这个问题。
我们假设我有类似这些模型的东西:
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
我明确地不想使用路由器多态魔法,但仍然可以从那里的动作自动检测中受益。
答案 0 :(得分: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
阅读本文以获取更多信息
class Article
def self.subclasses
@subclasses ||= []
end
def self.inherited(klass)
@subclasses ||= []
@subclasses << klass
end
end
答案 1 :(得分: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,可以概括一下,但这可能有点过分。
答案 2 :(得分:-1)
你可以尝试创建一个使用String.sub
或String.sub!
的方法(后者在内存中修改String对象)以暂时更改路由的实际值,或者你需要。