2009-10-09 7 views
2

J'ai une application Rails dans laquelle j'ai des centaines de modèles qui ont seulement des opérations CRUD. Je pourrais utiliser échafaudage/échafaudage actif, mais je finis par avoir autant de fichiers dans mon répertoire de l'application.Rails Application avec 500 modèles

Est-il possible de faire quelque chose comme avoir un modèle générique, une vue et un contrôleur pour gérer ces derniers plutôt que d'avoir 500 d'entre eux dans le dossier de l'application.

Répondre

7

Bien sûr.

class GenericCrudController < ApplicationController 
    def index 
    current_model.find(:all) 
    end 

    private 

    def current_model 
    params[:model].constantize = Class.new(ActiveRecord::Base) 
    end 
end 

La méthode current_model va créer un descendant de ActiveRecord::Base à la volée. Ce code est très basique, bien sûr.

Mise à jour: Cela va se plaindre qu'il n'y a pas de méthode constantize=. Vous devez probablement faire quelque chose comme ceci: Kernel.const_set(params[:model], Class.new(ActiveRecord::Base)).

1

Je vais construire sur ce qu'a dit August. Il y a aussi une erreur. Il devrait être:

def current_model 
    params[:model].constantize 
    end 

Vous voudrez probablement filtrer ce que le modèle peut être, sinon il pourrait être gênant si vous avez des modèles particuliers qu'ils ne devraient pas avoir accès. Pour la vue, vous pouvez vérifier le nombre de colonnes du modèle et préparer les champs appropriés pour ces vues.

0

Une autre option consiste à utiliser un plugin qui rend les interfaces CRUD riches. Un bon exemple est ActiveScaffold. Création de l'interface est aussi simple que:

class UsersController < ApplicationController 
    active_scaffold :user 
end 
+0

J'ai essayé l'échafaudage actif et il semble bon, mais le problème est que je finis toujours avec 500 fichiers dans le répertoire que je ne veux pas. – Sunny

+0

Oui, c'est correct. Peut-être que vous pouvez combiner l'approche current_model d'August et Jim avec active_scaffold. –

Questions connexes