class MeasurementsController < ApplicationController before_action :find_readout, only: [:destroy, :edit, :update] before_action except: :index do raise AccessForbidden unless current_user.at_least(:active) end def index @measurements = current_user.readouts.includes(:quantity, :unit).order(taken_at: :desc, id: :desc) end def new @quantities = current_user.quantities.ordered end def create taken_at = params.permit(:taken_at)[:taken_at] readout_params = params.permit(readouts: Readout::ATTRIBUTES).fetch(:readouts, []) @readouts = readout_params.map { |rp| current_user.readouts.build(rp.merge(taken_at: taken_at)) } if @readouts.present? && @readouts.all?(&:valid?) ActiveRecord::Base.transaction { @readouts.each(&:save!) } flash.now[:notice] = t('.success', count: @readouts.size) else errors = @readouts.flat_map { |r| r.errors.full_messages } flash.now[:alert] = errors.present? ? errors.first : t('.no_readouts') end end def edit @user_units = current_user.units.ordered end def update if @readout.update(params.require(:readout).permit(:value, :unit_id, :taken_at)) flash.now[:notice] = t('.success') else @user_units = current_user.units.ordered render :edit end end def destroy @readout.destroy! flash.now[:notice] = t('.success') end private def find_readout @readout = current_user.readouts.find(params[:id]) end end