如何找出Rails模型实例是否是一个奇异的资源?

时间:2013-10-11 20:36:39

标签: ruby-on-rails routes

在我的情况下,我得到一个资源的实例,我必须找出,它的模型类是代表单数还是复数资源。

我挖掘了Rails.application.routes和它的实例变量,但没有找到解决这个问题的可能性。

更新

我在gem中使用带有匿名模型实例的polymorphic_path助手,其中包含一些模型和控制器模块。最终目标是为REST控制器和模型提供一些自动机制,并提供当前模型/实例及其祖先的路径/路径。

我最近的尝试看起来像这样:

Rails.application.routes.instance_variable_get(:@router).instance_variable_get(:@routes).instance_variable_get(:@named_routes).delete_if{|k,v| !k.match(/my_model_name_as_downcased_string_here/)}.values.map{|v| v.instance_variable_get(:@defaults)}.map{|h| h[:action]}

希望它会提出行动:复数模型的索引和:显示单数。必须有一种方法来利用内省来找出一个模型是否是一个单一模型,我根本就找不到它。

1 个答案:

答案 0 :(得分:0)

由于我没有找到任何方法可以找到,无论资源是单数还是复数,我都是自己构建的。恕我直言,最安全的方式是直接创建路由。以下是我遇到同样问题时所做的事情:

# alias :resource method of Rails routing mapper and remember which resourses
# are setup as singular
module ActionDispatch::Routing::Mapper::Resources
  def resource_with_singular_recognizer *res, &block
    Rails.application.instance_variable_set(:@sr, ((Rails.application.instance_variable_get(:@sr) || []).push res.first).uniq)
    resource_without_singular_recognizer *res, &block
  end
  alias_method_chain :resource, :singular_recognizer
end

# define a model wide method :singular_resource? that checks the previously
# setup singular resource flag
module ClassMethods
  def singular_resource?
    Rails.application.instance_variable_get(:@sr).include? self.to_s.downcase.to_sym
  end
end

# include :singular_resource? method into all model classes
module Mongoid::Document
  def self.included base
    base.class_eval do
      extend ClassMethods
    end
  end
end

我知道:alias_method_chain不是这里的最佳选择,随时可以找到更好的解决方案。