Search code examples
ruby-on-railsrubysimple-form

Why my form don't work?


Here is my tournaments_controller file:

class TournamentsController < ApplicationController
before_action :authenticate_user!, only: [:new, :create, :destroy]

def index
end

def show
end

def new
    render action: 'new'
end

def create
    self.tournament = Tournament.new(tournament_params)
    if tournament.save
        flash[:info] = "Tournament created successfully!"
        redirect_to root_url
    else
        render action: 'new'
    end
end

def destroy
    Tournament.find(params[:id]).destroy
    flash[:success] = "Tournament deleted!"
    redirect_to root_url
end

private

    def tournament_params
        params.require(:tournament).permit(:name, :maxplayers)
    end

end

This is my form file:

        = form_for tournament do |f|
        - if tournament.errors.any?
            #error_explanation
            %h2= "#{pluralize(tournament.errors.count, "error")} prohibited this tournament from being saved:"
            %ul
                - tournament.errors.full_messages.each do |msg|
                    %li= msg

        .form-group
            = f.label :name
            = f.text_field :name, class: 'form-control'
            = f.submit 'Save', class: 'btn btn-primary'

When my app runs, console display this error:

undefined local variable or method `tournament' for #<#<Class:0x007f0e414fa2d0>:0x007f0e418d9a90>

I'm using simple-form and Haml if it's important. Can anyone explain to me why I am getting this error?


Solution

  • You have to use an instance variable:

    def new
        @tournament = Tournament.new
        render action: 'new'
    end
    
    def create
        @tournament = Tournament.new(tournament_params)
        if @tournament.save
            flash[:info] = "Tournament created successfully!"
            redirect_to root_url
        else
            render action: 'new'
        end
    end
    

    and

      = form_for @tournament do |f|
        - if @tournament.errors.any?
            #error_explanation
            %h2= "#{pluralize(@tournament.errors.count, "error")} prohibited this tournament from being saved:"
            %ul
                - @tournament.errors.full_messages.each do |msg|
                    %li= msg
    
        .form-group
            = f.label :name
            = f.text_field :name, class: 'form-control'
            = f.submit 'Save', class: 'btn btn-primary'
            = link_to 'Back', categories_path, class: 'btn btn-default'