0

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

我挖掘了 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]}

希望它能为复数模型带来行动 :index 和 :show 为单数模型。必须有一种方法可以利用内省来确定一个模型是否是一个单一的模型,我根本找不到问题。

4

1 回答 1

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 不是这里的最佳选择,请随时找到更好的解决方案。

于 2013-10-12T14:19:59.313 回答