在我的情况下,我得到一个资源的实例,我必须找出,它的模型类是代表单数还是复数资源。
我挖掘了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]}
希望它会提出行动:复数模型的索引和:显示单数。必须有一种方法来利用内省来找出一个模型是否是一个单一模型,我根本就找不到它。
答案 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不是这里的最佳选择,随时可以找到更好的解决方案。