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