Mam aplikację, która modeluje dom. Dom ma wiele pokojów, pokoi ma wiele świateł i małych urządzeń, itp. Posiadam również kontroler o nazwie Kalkulator, w ten sposób uzyskuje się dostęp do aplikacji. Dane są dodawane do domu (i jego pomieszczeń) za pomocą kontrolera kalkulatora. Następnie generowany jest raport, który znajduje się w app/views/calculator/report.html.erb.Gdzie powinna znajdować się logika obliczeń w aplikacji Rails?
Moje pytanie brzmi: gdzie powinny zostać wykonane wszystkie obliczenia i logika raportu? Obecnie mam to wszystko w widoku, z niektórymi rzeczy w calculator_helper. Normalnie miałoby to miejsce w modelu, prawda? Ale Kalkulator nie ma wygenerowanego modelu. Jaki jest standard w tym?
Oto kalkulator kalkulatora.
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
Pokaż nam swoją klasę kalkulatora. –
Podoba mi się odpowiedź Jamesa. Kolejnym pytaniem, które powinieneś sobie zadać, jest to, dlaczego rezygnujesz z konwencji - dlaczego kontroler kalkulatora obsługuje rzeczy, które z pozoru należą do kontrolera House'a? Nie mówię, że robisz to źle, po prostu mówię, że warto się zastanowić. –
Dobra uwaga, Andy. Ryan, weź MODELE, zanim zaczniesz się martwić kontrolerami i widokami. Dzięki temu podejściu odkryjesz, że właściwym miejscem do wszystkich obliczeń jest model House. –