Tengo una aplicación que modela una casa. La casa tiene_muchas habitaciones, habitaciones tiene_muchas luces y pequeños electrodomésticos, etc. También tengo un controlador llamado Calculadora que es cómo se accede a la aplicación. Los datos se agregan a la casa (y sus habitaciones) usando el controlador de la Calculadora. Luego se genera un informe, que se encuentra en app/views/calculator/report.html.erb.¿Dónde debería ir la lógica de cálculo en una aplicación de Rails?
Mi pregunta es ¿a dónde deben llegar todos los cálculos y la lógica del informe? Actualmente lo tengo todo en la vista, con algunas cosas en calculator_helper. Normalmente esto iría en el modelo, ¿verdad? Pero la calculadora no tiene un modelo que se generó. ¿Cuál es el estándar para esto?
Aquí está el controlador de la calculadora.
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
Por favor, muéstrenos su clase de calculadora. –
Me gusta la respuesta de James. Otra pregunta que creo que debería hacerse es por qué está abandonando la convención: ¿por qué el controlador de la calculadora maneja cosas que aparentemente pertenecen al controlador de la casa? No digo que lo estés haciendo mal, solo digo que vale la pena pensarlo un poco más. –
Buen punto, Andy. Ryan, obtén los MODELOS justo antes de que comiences a preocuparte por los controladores y las vistas. Usando este enfoque, puede descubrir que el lugar correcto para todos los cálculos es el modelo de la Casa. –