2014-01-21 4 views
0

Предположим, у меня есть приложение Rails 4, которое управляет объектами Widget, и с использованием простого наследования таблиц У меня есть специализации Widget::Foo и Widget::Bar.Создание общих путей для моделей STI в Rails 4

Я хотел бы управлять всеми объектами Widget через один WidgetsController.

У меня есть следующие модели:

class Widget < ActiveRecord::Base; end 

class Widget::Foo < Widget 
    # Foo specific details... 
end 

class Widget::Bar < Widget 
    # Bar specific details... 
end 

И простой контроллер:

class WidgetsController < ApplicationController 
    def index 
    @widgets = Widget.all 
    end 

    def show 
    @widget = Widget.find(params[:id]) 
    end 
end 

Мои маршруты включают

resources :widgets, only: [:index, :show} 

В моих index.html.haml у меня есть что-то вроде:

- @widgets.each do |widget| 
    = link_to "View your widget!", [@widget] 

В этом случае все идет не так.

Между url_for и polymorphic_path Rails попытается найти widget_foo_path, а не использовать сохранившуюся widget_path.

Я бы предпочел не добавлять дополнительные маршруты или контроллеры, и я бы предпочел не указывать хелпер URL вручную. Есть ли способ сказать Rails, что Widget::Foo и Widget::Bar объекты должны быть связаны с использованием помощника widget_path?

ответ

0

я в конечном итоге решение вопроса путем создания подмешать:

module GenericSTIRoutes 
    def initialize(klass, namespace = nil, name = nil) 
    super(klass, namespace, name) 

    superklass = klass 

    while superklass.superclass != ActiveRecord::Base 
     superklass = superklass.superclass 
    end 

    @param_key   = _singularize(superklass.name) 
    @route_key   = ActiveSupport::Inflector.pluralize(@param_key) 
    @singular_route_key = @param_key.dup 
    @route_key << "_index" if @plural == @singular 
    end 
end 

И тогда изменяющее Widget.model_name следующим образом:

def self.model_name 
    @_model_name ||= Class.new(ActiveModel::Name) do 
    include GenericSTIRoutes 
    end.new(self, nil) 
end 
Смежные вопросы