Jump To …

updates_controller.rb

class UpdatesController < ApplicationController
  before_filter :process_params
  before_filter :require_user, :only => [:timeline, :replies]

  def index
    @title = "updates"
    @list_class = "all"

    respond_to do |format|
      format.json {
        @updates = Update
        set_pagination
        render :json => @updates.map{ |u| UpdateJsonDecorator.decorate(u) }
      }
      format.html { render_index(Update) }
    end

  end

  def timeline
    @list_class = "friends"
    render_index(current_user.timeline(params))
  end

  def replies
    @list_class = "mentions"
    render_index(current_user.at_replies(params))
  end

  def show
    @update = Update.first(:id => params[:id])
    if @update
      render :layout => "update"
    else
      render :file => "#{Rails.root}/public/404", :status => 404
    end
  end

  def create

XXX: This should really be put into a model. Fat controller here!

    do_tweet = params[:tweet] == "1"
    u = Update.new(:text => params[:text],
                   :referral_id => params[:referral_id],
                   :author => current_user.author,
                   :twitter => do_tweet)

add entry to user’s feed

    current_user.feed.updates << u

    unless u.valid?
      flash[:error] = u.errors.values.join("\n")
    else
      current_user.feed.save
      current_user.save

tell hubs there is a new entry

      current_user.feed.ping_hubs

      flash[:notice] = "Update created."
    end

    if request.referrer
      redirect_to request.referrer
    else
      redirect_to root_path
    end
  end

  def destroy
    update = Update.first :id => params[:id]

security.

    if update.author == current_user.author
      update.destroy

      flash[:notice] = "Update Deleted!"
      redirect_to root_path
    else
      flash[:error] = "I'm afraid I can't let you do that, #{current_user.username}."
      redirect_to :back
    end
  end

  protected

Manage page state

  def set_pagination
    set_params_page
    @updates = @updates.paginate(:page => params[:page], :per_page => params[:per_page], :order => :created_at.desc)
    set_pagination_buttons(@updates)
  end

Render correct haml depending on request type

  def render_index(updates)
    @updates = updates
    set_pagination
    render :index, :layout => show_layout?
  end

  def process_params
    @update_id, @update_text = "", ""

Set update form state correctly

    id = params.fetch("reply") { params["share"] }
    if id
      u = Update.first(:id => id)
      @update_id = id
      @update_text = "@#{u.author.username} " if params["reply"]
      @update_text = "RS @#{u.author.username}: #{u.text}" if params["share"]
    elsif params["status"]
      @update_text = params["status"]
    end
  end
end