app/controllers/calagator/venues_controller.rb in calagator-1.0.0.rc2 vs app/controllers/calagator/venues_controller.rb in calagator-1.0.0.rc3

- old
+ new

@@ -5,129 +5,175 @@ class VenuesController < Calagator::ApplicationController # Provides #duplicates and #squash_many_duplicates include DuplicateChecking::ControllerActions require_admin only: [:duplicates, :squash_many_duplicates] + def venue + @venue ||= params[:id] ? Venue.find(params[:id]) : Venue.new + end + + # GET /venues - # GET /venues.xml def index @search = Venue::Search.new(params.permit!) @venues = @search.venues + flash[:failure] = @search.failure_message + return redirect_to venues_path if @search.hard_failure? + render_venues @venues + end + + def render_venues venues respond_to do |format| format.html # index.html.erb format.kml # index.kml.erb - format.xml { render :xml => @venues } - format.json { render :json => @venues, :callback => params[:callback] } - format.js { render :json => @venues, :callback => params[:callback] } + format.xml { render xml: venues } + format.json { render json: venues } + format.js { render json: venues } end end + private :render_venues + + # GET /autocomplete via AJAX def autocomplete @venues = Venue .non_duplicates .in_business .where(["LOWER(title) LIKE ?", "%#{params[:term]}%".downcase]) .order('LOWER(title)') - respond_to do |format| - format.json { render :json => @venues, :callback => params[:callback] } - end + render json: @venues end + # GET /venues/map def map @venues = Venue.non_duplicates.in_business end + # GET /venues/1 - # GET /venues/1.xml def show - @venue = Venue.find(params[:id]) + Show.new(self).call + end - return redirect_to @venue.duplicate_of if @venue.duplicate? + class Show < SimpleDelegator + def call + show_all_if_not_found or redirect_to_progenitor or render_venue + end - respond_to do |format| - format.html - format.xml { render xml: @venue } - format.json { render json: @venue, callback: params[:callback] } - format.ics { render ics: @venue.events.order("start_time ASC").non_duplicates } + private + + def show_all_if_not_found + return if venue + rescue ActiveRecord::RecordNotFound => exception + redirect_to venues_path, flash: { failure: exception.to_s } end - rescue ActiveRecord::RecordNotFound => e - flash[:failure] = e.to_s - redirect_to venues_path + def redirect_to_progenitor + redirect_to venue.progenitor if venue.duplicate? + end + + def render_venue + respond_to do |format| + format.html + format.xml { render xml: venue } + format.json { render json: venue } + format.ics { render ics: venue_events } + end + end + + def venue_events + venue.events.order(:start_time) + end end + # GET /venues/new - # GET /venues/new.xml def new - @venue = Venue.new + venue render layout: params[:layout] != "false" end + # GET /venues/1/edit def edit - @venue = Venue.find(params[:id]) + venue end - # POST /venues - # POST /venues.xml + + # POST /venues, # PUT /venues/1 def create - @venue = Venue.new - create_or_update + CreateOrUpdate.new(self).call end + alias_method :update, :create - # PUT /venues/1 - # PUT /venues/1.xml - def update - @venue = Venue.find(params[:id]) - create_or_update - end + class CreateOrUpdate < SimpleDelegator + def call + block_spammers or (save and render_success) or render_failure + end - def create_or_update - @venue.attributes = params.permit![:venue] || {} - respond_to do |format| - if !evil_robot? && @venue.save - format.html { redirect_to from_event || @venue, flash: { success: "Venue was successfully saved." } } - format.xml { render xml: @venue, status: :created, location: @venue } - else - format.html { render action: @venue.new_record? ? "new" : "edit" } - format.xml { render xml: @venue.errors, status: :unprocessable_entity } + private + + def block_spammers + return unless params[:trap_field].present? + flash[:failure] = "<h3>Evil Robot</h3> We didn't save this venue because we think you're an evil robot. If you're really not an evil robot, look at the form instructions more carefully. If this doesn't work please file a bug report and let us know." + render_failure + end + + def save + venue.update_attributes params.permit![:venue].to_h + end + + def render_success + respond_to do |format| + format.html { redirect_to from_event || venue, flash: { success: "Venue was successfully saved." } } + format.xml { render xml: venue, status: :created, location: venue } end end + + def render_failure + respond_to do |format| + format.html { render action: venue.new_record? ? "new" : "edit" } + format.xml { render xml: venue.errors, status: :unprocessable_entity } + end + end + + def from_event + Event.find_by_id(params[:from_event]) + end end + # DELETE /venues/1 - # DELETE /venues/1.xml def destroy - @venue = Venue.find(params[:id]) + Destroy.new(self).call + end - if @venue.events.any? + class Destroy < SimpleDelegator + def call + prevent_destruction_of_venue_with_events or destroy + end + + private + + def prevent_destruction_of_venue_with_events + return if venue.events.none? message = "Cannot destroy venue that has associated events, you must reassociate all its events first." respond_to do |format| - format.html { redirect_to @venue, flash: { failure: message } } + format.html { redirect_to venue, flash: { failure: message } } format.xml { render xml: message, status: :unprocessable_entity } end - else - @venue.destroy + end + + def destroy + venue.destroy respond_to do |format| - format.html { redirect_to venues_path, flash: { success: %("#{@venue.title}" has been deleted) } } + format.html { redirect_to venues_path, flash: { success: %("#{venue.title}" has been deleted) } } format.xml { head :ok } end end - end - - private - - def evil_robot? - if params[:trap_field].present? - flash[:failure] = "<h3>Evil Robot</h3> We didn't save this venue because we think you're an evil robot. If you're really not an evil robot, look at the form instructions more carefully. If this doesn't work please file a bug report and let us know." - end - end - - def from_event - Event.find_by_id(params[:from_event]) end end end