Error en Rails 5 ActionController::InvalidAuthenticityToken

Tengo una aplicación rails que estoy planeando actualizar a rails 5. Estoy usando devise(v4.2.0) junto con rails(v5.0.0). Como se sugiere en el archivo README.md de devise, he intentado mover el protect_from_forgery por encima del before_filter, pero todavía cuando estoy tratando de iniciar sesión o actualizar mi error me sale un error ActionController::InvalidAuthenticityToken.

Mi Application Controller es

class ApplicationController < ActionController::Base
 protect_from_forgery with: :exception, prepend: true
 before_action :configure_permitted_parameters, if: :devise_controller?

  protected

   def configure_permitted_parameters
     devise_parameter_sanitizer.permit(:sign_up, keys: [:name])
     devise_parameter_sanitizer.permit(:account_update, keys: [:name])
   end

end

Y mi otro BugController es

class BugsController < ApplicationController
  protect_from_forgery prepend: true, with: :exception
  before_action :authenticate_user!
  before_action :set_bug, only: [:show, :edit, :update]

    def update
      respond_to do |format|
      if @bug.update(bug_params)
        format.html { redirect_to @bug, notice: 'Bug was successfully updated.' }
        format.json { render :show, status: :ok, location: @bug }
     else
        format.html { render :edit }
        format.json { render json: @bug.errors, status: :unprocessable_entity }
     end
     end
   end

private
def bug_params
  params.require(:bug).permit(:product, :component, :title, :description, :status_id, :created_by_id, :assigned_to_id)
end

end

Como se indica en las notas Devise documentation para Rails 5

Para Rails 5, ten en cuenta que ya no se añade protect_from_forgery a la cadenabefore_action, por lo que si hemos puestoauthenticate_user

antes de protect_from_forgery, su petición resultará en "Can't verificar la autenticidad token CSRF." Para resolver esto, o bien cambiar el orden en que los llama, o utilice protect_from_forgery prepend: true.

Comentarios (3)
Solución

Nota: Aunque esta respuesta tiene el efecto deseado, lo hace reduciendo la seguridad general. La siguiente respuesta de Alon es más correcta y mantiene la seguridad del sitio.

class BugsController < ApplicationController
skip_before_filter :verify_authenticity_token
protect_from_forgery prepend: true, with: :exception
before_action :authenticate_user!
before_action :set_bug, only: [:show, :edit, :update]
end

Así

Comentarios (8)

Yo he utilizado algo así y me funciona.

class WelcomeController < ActionController::Base
    protect_from_forgery with: :exception
    before_action :authenticate_model!
end
Comentarios (0)