Klasyczny przykład. Mam formularz z danymi wejściowymi raportu, po kliknieciu Submit powinien być wygenerowany raport.
Zarys metod:
[code=ruby]# controller
def recipes_month
if recipes_month_params
# generowanie raportu, wykorzystanie metody
# recipes_month_params do pobrania hashmapy
# z parametrami raportu
else
render :action => “recipes_month_params”
end
end
protected
def recipes_month_params
unless @recipes_month_params
# build date tworzy obiekt typu Date na podstawie danych przesłąnych przez
# helper date_select, zwraca nil, jesli data jest nieprawidłowa
# metoda ta jest w appcontroller jako protected
selected_date = build_date_from(params, “month”)
community = Community.find(:first, params[:community_id]) if params[:community_id]
if seleted_date and community
p = {
:range => selected_date.beginning_of_month…selected_date.end_of_month,
:community => community
} @recipes_month_params = p unless p.any? { |k,v| v.nil? }
end
end @recipes_month_params
end[/code]
A jak Wy to robicie? To rozwiązanie wydaje mi się dość skomplikowane ale zabezpiecza przed przesłaniem POSTem nieprawidłowych/niekompletnych parametrów.
Ruby to język obiektowy, zrobienie klasy, która to obsłuży będzie dobrym wyjściem nie tylko dla walidacji. A co jak będziesz musiał dodać więcej logiki biznesowej? Jak to łatwo stestować? Poszukaj jakiegoś pluginu tableless model i jadziesz
Ok, jestem na tyle przekonany, że spróbuję, sęk w tym, że dla każdego raportu w takim razie powinienem zrobić osobny kontroler?
Raporty są w oddzielnym namespace “report”.
[code=ruby]# model/report/recipes_monthly_summary_params.rb
class Report::RecipesMonthlySummaryParams
include Validatable
validates_presence_of :community, :message => “musi zostać wybrana”
validates_presence_of :range, :message => “musi zostać określony”
attr_accessor :community, :range
def initialize(params)
date = build_date_from(params, “month”)
if date @range = date.beginning_of_month…date.end_of_month
end
if params[“community_id”] @community = Community.find(params[“community_id”])
end
end
end[/code]
W kontrolerze tworzę tylko obiekt tej klasy przekazując do konstruktora hashmapę params z parametrami z formularza. Potem tylko sobie sprawdzam metodą valid? czy wszystko gra