April 02, 2013

More Complicated Than It Needs To Be

Once you’ve hit the point where a simpler pattern isn’t working for you anymore and you have to start using the more complicated one, [there’s a natural tendency] to then always reach for the complicated one in other situations where the simple one would be just fine. Martin Fowler

The Boss needs an app to capture employee suggestions --- we can't use a cardboard box with a cut-out slot, we are a software company!

class SuggestionsController < ApplicationController::Base
  before_filter :authenticate!
  before_filter :boss_only, except: [:new, :create]

  def index
    @suggestions = Redis.find_by_key("suggestions")
    
    unless @suggestions
      @suggestions = Respository.for(:suggestion).all

      Resque.enqueue(CacheSuggestionJob, @suggestions)
      Logger.log(I18n.t(:cache_not_warm))
    end

    @suggestions = SuggestionDecorator.decorate_collection(@suggestions)
  end

  def new
    @suggestion = FormBuilder.for(:suggestion)
  end

  def create
    @suggestion = Suggestion.new params.require(:idea).permit(:category)

    if @suggestion.valid?
      current_user.extend SuggestionSubmitter
      current_user.suggest(@suggestion)

      Resque.enqueue(NotifyBossJob, @suggestion) unless current_user.intern?
      Resque.enqueue(AddToDailyEmailDigestJob, @suggestion)

      flash[:success] = I18n.t(:thank_you)
      redirect_to root_url
    else
      Logger.log(I18n.t(:invalid_suggestion_attempt), 
                 current_user, @suggestion)
      
      flash[:error] = @suggestion.error_messages
      render :new
    end
  end
end

Sometimes simple is better.

class SuggestionBox < Sinatra::Base
  get "/" do
    erb :form
  end

  post "/suggest" do
    suggestion = "#{params[:idea]} #{params[:category]}\n"

    # The Boss ♥'s Dropbox
    File.open('~/Dropbox/suggestion_box.txt', 'a'){ |f| f.write(suggestion) }

    flash[:success] = "Thanks!"
    redirect to("/")
  end
end