2016-07-12 6 views
20

У меня есть приложение rails, которое я планирую обновить до рельсов 5. Я использую devise (v4.2.0) вместе с рельсами (v5.0.0). Как было предложено в DEViSE README.md файл, я попытался перемещение protect_from_forgery над before_filter, но до сих пор, когда я пытаюсь войти в систему или обновить ошибку я получаю сообщение об ошибке ActionController::InvalidAuthenticityTokenRails 5 ActionController :: InvalidAuthenticityToken error

Мои Application Controller является

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 

И мой другой BugController является

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 

ответ

10
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 

Как это

+0

Я попытался поместить 'skip_before_filter: verify_authenticity_token' в контроллер ошибок, но все равно не работает. – HSD

+0

показать мне, куда вы положили – Boltz0r

+0

В 'Bugs controller'' protect_from_forgery preend: true, with:: exception before_action: authenticate_user! before_action: set_bug, только: [: шоу, редактировать,: обновление] ' – HSD

46

Как указано в Devise documentation примечаниях для Rails 5

Для Rails 5, обратите внимание, что protect_from_forgery больше не предваряется к before_action цепи, так что если вы установили authenticate_user перед тем protect_from_forgery Ваш запрос приведет к «Can 't проверить подлинность маркера CSRF. " Чтобы решить эту проблему, измените заказ , в котором вы их называете, или используйте protect_from_forgery prepend: true.

+6

Это похоже на лучший способ, чем пропустить проверку токена аутентичности !! – Stephen

+1

Это должен быть выбранный ответ – Tallboy

1

Я использовал что-то вроде этого, и это работает для меня.

class WelcomeController < ActionController::Base 
    protect_from_forgery with: :exception 
    before_action :authenticate_model! 
end 
1

Недавно я попал в этот довольно большой путь, и я обнаружил, что моя ошибка была доменное имя моего приложения в последнее время изменилось, но я забыл обновить session_store.rb. Это может быть не проблема каждого, но она сообщит об этом как ошибку CSRF. Поэтому, пожалуйста, проверьте config/session_store.rb

Смежные вопросы