Solucionado (ver solução)
Solucionado
(ver solução)
9
respostas

Erro: "app/controllers/users_controller.rb:37: syntax error, unexpected keyword_end, expecting end-of-input"

Olá, fiz os curso de Ruby e Rails e agora estou fazendo um projetinho para praticar. Solicito ajuda no erro titulado acima. Segue arquivo do erro. Se precisar de outros arquivos para poder me ajudar é só pedir.

class UsersController < ApplicationController

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

    def new
        @user = User.new
    end

    def create
        @user = User.new(user_params)
        if @user.save
            redirect_to @user, notice: 'Cadastro criado com sucesso!'
        else
            render action: :new
        end
    end

    def edit
        @user = User.find(params[:id])
    end

    def update
        @user = User.find(params[:id])
        if @user.update(user_params)
            redirect_to @user, notice: 'Cadastro atualizado com sucesso!'
        else
            render action: :edit
        end
    end

    private
    def user_params
        params.require(:user).permit(:email, :full_name, :location, :password, :password_confirmation, :info)
    end
end

o recurso Carro usei o generate para criar, agora o User fiz na mão para sintetizar melhor meu aprendizado.

9 respostas

Consegue colar pra gente o arquivo da ApplicationController ?

class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception
end

Hum, bem complexo o seu problema. Eu acho que você não deveria se preocupar muito com CSRF já que é um projeto pra aprendizado. Mas se quer aprender mesmo CSRF dá uma olhada nesse link https://nvisium.com/blog/2014/09/10/understanding-protectfromforgery.html e ve se resolve seu caso.

André, foi o próprio Rails que gerou essa classe. A suspeita da fonte do problema eu acredito ser reflexo do arquivo app/models/user.rb. Vou colocar abaixo para ver o que acha.

class User < ApplicationRecord
    EMAIL_REGEXP = /\A[^@]+@([^@\.]+\.)+[^@\.]+\z/

    validates_presence_of :email, :full_name, :location, :password
    validates_confirmation_of :password
    validates_length_of :info, minimum: 30, allow_blank: false
    validates_uniqueness_of :email

    validate :email_format

    private

    # Essa validação pode ser representada da seguinte forma:
    # validates_format_of :email, with: EMAIL_REGEXP
    def email_format
        errors.add(:email, :invalid) unless email.match(EMAIL_REGEXP)
    end
end

Estou inseguro da forma que estou fazendo para validar e-mail de um novo usuário.

Não creio que o problema seja a user.rb.

Ao analisar o erro "app/controllers/users_controller.rb:37: syntax error, unexpected keyword_end, expecting end-of-input"

Esse erro acontece quando tem um end a mais, ou quando começa o código com Class ao invés de class. ai ele pensa que tem um end a mais.

Eu acho que é algum errinho de digitação. Mas não to conseguindo achar.

solução!

https://github.com/bitmakerlabs/debugging-guide/wiki/Ruby-error:-unexpected-end-of-input,-expecting-keyword_end Aqui fala mais sobre esse erro.

O engraçado é que quando jogo o seu código em https://repl.it/repls/HeftyFlawedGenericsoftware

e apago a derivação da linha class UsersController < ApplicationController ficando somente class UsersController

ele compila... não quer parecer chato, mas tem certeza que o conteúdo que colou é o mesmo que está tentando rodar?

Eu fiz um

class UsersController < ApplicationController
    =begin
    <<<todo o código aqui>>>
    =end
end

e deu o mesmo erro, (só mudo o índice da linha do erro). Então está me fazendo crer que o problema está em outro lugar. Enfim, vou refazer aqui usando rails generate scaffold user email full_name location password password_confirmation info:text --force para não ficar travado.

Consegui resolver aqui da seguinte forma: joguei o projeto no lixo e recomecei do zero.Agora tá sussa!!!Não faço a menor ideia do que estava errado, mas vou continuar aqui. segue abaixo o código atual: classe users_controller.rb

class UsersController < ApplicationController
    def show
        @user = User.find(params[:id])
    end
    def new
        @user = User.new
    end
    def create
        @user = User.new(user_params)
        if @user.save
            redirect_to @user, notice: 'Cadastro criado com sucesso!'
        else
            render action: :new
        end
    end

    private

    def user_params
        params.require(:user).permit(:email, :nome_completo, :endereco, :rg, :cpf, :cnh, :password, :password_confirmation)
    end
end

classe user.rb

class User < ApplicationRecord
    validates_presence_of :email, :nome_completo, :endereco, :cpf, :rg, :password
    validates_confirmation_of :password
    validates :email, presence: true,
                    format: { with: /\A[^@]+@([^@\.]+\.)+[^@\.]+\z/ },
                    uniqueness: true
end

classe application_controller.rb

class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception
end

As vezes tem que dar um rebuild no código. Ou então use o notepad++ pra comparar as diferenças entre os códigos.