user3324787
user3324787

Reputation: 5

Syntax Explanation for End Keyword

Here is a file for an app I'm trying to make (from the Hartl tutorial, it is just a basic twitter app). The site wasn't loading until I added the third 'end' at the very bottom which was suggested by the browser, but I can't figure out why this is needed. I get all the "def"'s need to have a keyword "end" but why are there 3 "end"'s at the end of the code.

class UsersController < ApplicationController
  before_action :signed_in_user,
                only: [:index, :edit, :update, :destroy, :following, :followers]
  before_action :correct_user,   only: [:edit, :update]
  before_action :admin_user,     only: :destroy

    def index
     @users = User.paginate(page: params[:page])
    end 


    def show
      @user = User.find(params[:id])
      @microposts = @user.microposts.paginate(page: params[:page])
    end

    def destroy
      User.find(params[:id]).destroy
      flash[:success] = "User deleted."
      redirect_to users_url
    end

    def new
      @user = User.new
    end

    def edit
    end

      def update
      if @user.update_attributes(user_params)
        flash[:success] = "Profile updated"
        redirect_to @user
      else
        render 'edit'
      end


      def create
      @user = User.new(user_params)
      if @user.save
        sign_in @user
        flash[:success] = "Welcome to the Sample App!"
        redirect_to @user
      else
        render 'new'
      end

     def following
      @title = "Following"
      @user = User.find(params[:id])
      @users = @user.followed_users.paginate(page: params[:page])
      render 'show_follow'
     end

      def followers
        @title = "Followers"
        @user = User.find(params[:id])
        @users = @user.followers.paginate(page: params[:page])
        render 'show_follow'
      end



   private

      def user_params
        params.require(:user).permit(:name, :email, :password,
                                     :password_confirmation)
      end

      # Before filters


      def correct_user
        @user = User.find(params[:id])
        redirect_to(root_url) unless current_user?(@user)
      end

      def admin_user
        redirect_to(root_url) unless current_user.admin?
      end
end
end
end

Upvotes: 0

Views: 115

Answers (3)

Kirti Thorat
Kirti Thorat

Reputation: 53038

Add end to update and create methods as the methods are not closed. Also, out of the 3 end at the bottom, remove the two end leaving just one end for your class.

    def update
      if @user.update_attributes(user_params)
        flash[:success] = "Profile updated"
        redirect_to @user
      else
        render 'edit'
      end
    end    ## This end was missing

    def create
      @user = User.new(user_params)
      if @user.save
        sign_in @user
        flash[:success] = "Welcome to the Sample App!"
        redirect_to @user
      else
        render 'new'
      end
    end   ## This end was missing

Upvotes: 1

Coenwulf
Coenwulf

Reputation: 1937

  1. You're missing the end on the update method (probably an oversight caused by bad indentation).
  2. You're missing the end on the create method (probably an oversight caused by bad indentation).
  3. The class itself needs an end

Correctly formatted it should look like:

class UsersController < ApplicationController
  before_action :signed_in_user,
                only: [:index, :edit, :update, :destroy, :following, :followers]
  before_action :correct_user,   only: [:edit, :update]
  before_action :admin_user,     only: :destroy

  def index
   @users = User.paginate(page: params[:page])
  end 


  def show
    @user = User.find(params[:id])
    @microposts = @user.microposts.paginate(page: params[:page])
  end

  def destroy
    User.find(params[:id]).destroy
    flash[:success] = "User deleted."
    redirect_to users_url
  end

  def new
    @user = User.new
  end

  def edit
  end

  def update
    if @user.update_attributes(user_params)
      flash[:success] = "Profile updated"
      redirect_to @user
    else
      render 'edit'
    end
  end

  def create
    @user = User.new(user_params)
    if @user.save
      sign_in @user
      flash[:success] = "Welcome to the Sample App!"
      redirect_to @user
    else
      render 'new'
    end
  end

  def following
    @title = "Following"
    @user = User.find(params[:id])
    @users = @user.followed_users.paginate(page: params[:page])
    render 'show_follow'
  end

  def followers
    @title = "Followers"
    @user = User.find(params[:id])
    @users = @user.followers.paginate(page: params[:page])
    render 'show_follow'
  end

  private

  def user_params
    params.require(:user).permit(:name, :email, :password,
                                 :password_confirmation)
  end

  # Before filters

  def correct_user
    @user = User.find(params[:id])
    redirect_to(root_url) unless current_user?(@user)
  end

  def admin_user
    redirect_to(root_url) unless current_user.admin?
  end
end

Upvotes: 0

sergelerator
sergelerator

Reputation: 576

following and the private methods were defined inside the create method, which was created inside the update method. I doubt you wanted to do that. So the three ends at the end of the file close create, then update, and then the class. You need an end after if clauses, maybe that's what caused the confusion.

Upvotes: 0

Related Questions