Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails rails URL帮助程序中的显式非多态URL_Ruby On Rails_Ruby_Ruby On Rails 3_Routing - Fatal编程技术网

Ruby on rails rails URL帮助程序中的显式非多态URL

Ruby on rails rails URL帮助程序中的显式非多态URL,ruby-on-rails,ruby,ruby-on-rails-3,routing,Ruby On Rails,Ruby,Ruby On Rails 3,Routing,我正在努力寻找一个干净的方法来解决这个问题 让我们假设我有这样的模型: class Article end class FooArticle < Article end class BarArticle < Article end 上述操作将导致未知路由错误,因为它无法解析foo\u article\u path或bar\u article\u path——但对于新记录,它可以工作,因为我通过@article=article.new实例化了它们 现在的问题是:是否有一种方法可以

我正在努力寻找一个干净的方法来解决这个问题

让我们假设我有这样的模型:

class Article
end

class FooArticle < Article
end

class BarArticle < Article
end
上述操作将导致未知路由错误,因为它无法解析
foo\u article\u path
bar\u article\u path
——但对于新记录,它可以工作,因为我通过
@article=article.new
实例化了它们

现在的问题是:是否有一种方法可以切换路径参数,这样我就不必编写以下代码:

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

我明确不想使用路由器多态魔法,但仍然可以从中受益。你可以尝试创建一个使用
String.sub
String.sub的方法(后者修改内存中的字符串对象)以临时更改路由的实际值,或以您需要的方式更改路由的实际值。

尝试以下操作:

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
更多信息请阅读本文

类文章
def self.subclass
@子类| |=[]
结束
def自我继承(klass)
@子类| |=[]

@子类可以通过在子类上设置model_name方法来实现这一点:

但是,我会担心可能的副作用,所以我会自己做助手:

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

如果您愿意并允许传递路径前缀,您可以对此进行概括,但这可能有些过分。

是的,但这并不能解决(@article)基于
@article
类型生成参数值的表单等问题。因此,
@article
=article.new将生成params[:article],而@article=FooArticle.new将生成params[:foo_article]——这使得在发布+1伟大建议时无法在控制器中处理它-不幸的是,在这种情况下,这并不真正起作用。(我一开始也想到了这一点)唯一的问题是我的子类型代表了用户提供的模板模型,这些模板不在我的Gem范围内,所以我希望避免修补路由(有时会有100个文章子类)
class Article
  def self.subclasses
    @subclasses ||= []
  end

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

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