rails url helper中的显式非多态URL

时间:2013-09-03 07:44:36

标签: ruby-on-rails ruby ruby-on-rails-3 routing

我正在努力用干净的方式解决这个问题。

我们假设我有类似这些模型的东西:

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_pathbar_article_path - 但是由于我通过@article = Article.new实例化了新记录,因此它有效。

所以现在问题是:是否有一个方法可以切换路径参数,所以我不必编写这段代码:

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

我明确地不想使用路由器多态魔法,但仍然可以从那里的动作自动检测中受益。

3 个答案:

答案 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

阅读本文以获取更多信息

STI, one controller

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.subString.sub!的方法(后者在内存中修改String对象)以暂时更改路由的实际值,或者你需要。