【问题标题】:Single Controller, multiple (inherited) classes (rails 3)单个控制器,多个(继承的)类(rails 3)
【发布时间】:2011-02-24 16:21:37
【问题描述】:

我有一个基类通过单表继承由其他 2 人继承。出于各种原因,我希望所有子类共享相同的控制器/视图——唯一真正的区别在于模型的功能。

但是,当我尝试使用 link_to "stuff", instance_of_child 时,我收到有关无法找到正确页面的投诉。

我试过弄乱 ma​​tch '/subclass' => redirect('/parent') 但这会产生没有意义的奇怪链接。有什么建议?我对 rails 很陌生,我承认我对 routes.rb 的理解仍然有限——但是,我不完全确定这是否是我应该寻找的地方。

【问题讨论】:

    标签: ruby-on-rails-3 controller single-table-inheritance


    【解决方案1】:

    来自http://www.alexreisner.com/code/single-table-inheritance-in-rails

    如果您曾尝试将 STI 添加到 您现有的 Rails 应用程序 可能知道你的许多 link_to 和 form_for 方法抛出 添加父类时出错。 这是因为 ActionPack 看起来 要确定的对象的类别 它的路径和 URL,而你没有 新子类的映射路线。 不过,您可以像这样添加路线 我不推荐它:

    # NOT recommended:
    map.resources :cars,        :as => :vehicles, :controller => :vehicles
    map.resources :trucks,      :as => :vehicles, :controller => :vehicles
    map.resources :motorcycles, :as => :vehicles, :controller => :vehicles
    

    这只会缓解特定的 症状。如果我们使用 form_for,我们的表单 字段仍然没有名称 我们期望(例如:params[:car][:color] 而不是 params[:vehicle][:color])。 相反,我们应该攻击的根源 通过实施问题 父类中的 model_name 方法。 我还没有看到任何文档 这种技术,所以这是非常 非官方的,但它是有道理的,它 在 Rails 2.3 中非常适合我 和 3:

    def self.inherited(child)  
      child.instance_eval do
        def model_name
          Vehicle.model_name
        end
      end
      super 
    end
    

    这可能看起来令人困惑,所以让 我解释一下:

    当您调用 URL 生成方法时 (例如:link_to("car", car))、ActionPack 在类上调用 model_name 给定对象(这里是汽车)。这返回 一种特殊类型的字符串 确定对象的名称 在网址中。我们在这里所做的只是 覆盖 model_name 方法 Vehicle 的子类,因此 ActionPack 将看到汽车、卡车和摩托车 子类属于父类 类(车辆),因此使用 父类的命名路由 (VehiclesController) URL 所在的位置 生成。这一切都假设你是 使用 Rails 资源样式(RESTful) 网址。 (如果你不是,请这样做。)

    调查model_name 自己调用,查看 Rails 的源代码 ActionController::RecordIdentifier#model_name_from_record_or_class 方法。在 Rails 2.3 中,特殊的 字符串是一个实例 ActiveSupport::ModelName,在 Rails 3 中 这是一个 ActiveModel::Name

    【讨论】:

    • 这正是我想要的。弄乱路由表似乎是一个糟糕的解决方法,是的,我注意到它弄乱了我的表单。因此,只需对上面的示例稍作修改以使其适合我的类名,您的解决方案就解决了我的麻烦。你不知道我是多么害怕创建/维护这些额外的控制器。
    猜你喜欢
    • 2013-02-20
    • 2013-08-06
    • 1970-01-01
    • 2013-04-29
    • 1970-01-01
    • 2019-03-30
    • 1970-01-01
    • 2020-08-22
    • 1970-01-01
    相关资源
    最近更新 更多