J'ai une application qui modélise une maison. La maison a de nombreuses chambres, chambres a beaucoup de lumières et de petits appareils, etc. J'ai aussi un contrôleur appelé Calculatrice qui est la façon dont l'application est accessible. Les données sont ajoutées à la maison (et à ses pièces) à l'aide du contrôleur de la calculatrice. Ensuite, un rapport est généré, qui se trouve à app/views/calculator/report.html.erb.Quelle devrait être la logique de calcul dans une application Rails?
Ma question est où aller tous les calculs et la logique pour le rapport? Actuellement, j'ai tout dans la vue, avec certaines choses dans calculator_helper. Normalement, cela irait dans le modèle, non? Mais Calculator n'a pas de modèle qui a été généré. Quelle est la norme pour cela?
Voici le contrôleur de la calculatrice.
class CalculatorController < ApplicationController
def index
end
def save_house
@house = House.new(params[:house])
respond_to do |format|
if @house.save
format.html { render :action => 'add_rooms', :id => @house }
format.xml { render :xml => @house, :status => :created, :location => @house }
else
format.html { render :action => 'index' }
format.xml { render :xml => @house.errors, :status => :unprocessable_entity }
end
end
end
def add_rooms
@house = House.find(params[:id])
@rooms = Room.find_by_house_id(@house.id)
rescue ActiveRecord::RecordNotFound
logger.error("Attempt to access invalid house #{params[:id]}")
flash[:notice] = "You must create a house before adding rooms"
redirect_to :action => 'index'
end
def add_room
@room = Room.new(params[:room])
@house = @room.house
respond_to do |format|
if @room.save
flash[:notice] = "Room \"#{@room.name}\" was successfully added."
format.html { render :action => 'add_rooms' }
format.xml { render :xml => @room, :status => :created, :location => @room }
else
format.html { render :action => 'add_rooms' }
format.xml { render :xml => @room.errors, :status => :unprocessable_entity }
end
end
rescue ActiveRecord::RecordNotFound
logger.error("Attempt to access invalid house #{params[:id]}")
flash[:notice] = "You must create a house before adding a room"
redirect_to :action => 'index'
end
def report
flash[:notice] = nil
@house = House.find(params[:id])
@rooms = Room.find_by_house_id(@house.id)
rescue ActiveRecord::RecordNotFound
logger.error("Attempt to access invalid house #{params[:id]}")
flash[:notice] = "You must create a house before generating a report"
redirect_to :action => 'index'
end
end
S'il vous plaît nous montrer votre classe Calculatrice. –
J'aime la réponse de James. Une autre question que vous devriez vous poser, c'est pourquoi vous êtes en train de rompre avec la convention - pourquoi le contrôleur de la Calculatrice gère-t-il des choses qui semblent appartenir au contrôleur de la Maison? Je ne dis pas que vous le faites mal, je dis juste que ça vaut la peine d'y réfléchir davantage. –
Bon point, Andy. Ryan, obtenez les MODÈLES avant de commencer à vous inquiéter des contrôleurs et des vues. En utilisant cette approche, vous pouvez découvrir que le bon endroit pour tous les calculs est le modèle de la maison. –