Задать вопрос
vladimir_e
@vladimir_e

Почему Devise или Cancan разлогинивает админа при попытке удаления любой записи?

Здравствуйте.


Может кто-то сталкивался. Когда я в браузере нажимаю на линк удалить любой ресурс, например категорию, меня разлогинивает и редиректит на страницу входа. И cancan и devise (в зависимости как я проверяю в контроллере). Остальные акшены работают.


В коде имеется следующее:

app/models/ability.rb
class Ability
  include CanCan::Ability

  def initialize(user)
    user ||= User.new # guest user (not logged in)
    if user.has_role? :admin
      can :manage, :all
    end
  end
end


app/controllers/admin/categories_controller.rb
class Admin::CategoriesController < ApplicationController
  layout "admin"
  # метод cancan
  load_and_authorize_resource
  # в другом контроллере вместо load_and_authorize_resource используется devise'овский метод:
  before_filter :authenticate_user! #  для эксперимента
  
  # ...
  # весь код после скаффолда даже не изменялся 
  # ...

  # DELETE /admin/categories/1
  # DELETE /admin/categories/1.json
  def destroy
    @category = Category.find(params[:id])
    @category.destroy

    respond_to do |format|
      format.html { redirect_to admin_categories_url }
      format.json { head :no_content }
    end
  end


app/models/category.rb
class Category < ActiveRecord::Base
  has_many    :subcategories,   class_name: "Category"
  belongs_to  :parent_category, class_name: "Category", foreign_key: "category_id"
  attr_accessible :name, :description, :category_id, :order
  validates_presence_of :name
  before_create :set_max_order
  after_initialize :set_max_order, :if => Proc.new { |c| self.order < 1  }

  private 

  def set_max_order
    self.order = max_order + 1
  end

  def max_order
    Category.maximum(:order) || 0
  end
end


app/views/admin/categories/index.html.erb
<% @categories.each do |category| %>
  # .... 
  <% if can? :destroy, category %>
    <td><%= link_to 'Delete', category, confirm: 'Are you sure?', method: :delete %></td>
  <% end %>
<% end %>



Вроде все должно работать. И даже можно сказать работает — проходит следующие тесты:
it "should delete category" do
    visit admin_categories_path
    expect { click_link "Delete" }.to change(Category, :count).by(-1)
  end

  it "should definately delete category" do
    visit admin_categories_path
    page.should have_selector('table.data tbody tr', :count => 1)
    click_link "Delete"
    page.should_not have_selector('table.data tbody tr')
    page.should have_content('Categories')
  end



На вкладке network вижу
Request URL:    /admin/categories/5
Request Method:  POST
Status Code:    302 Found


но даже в чистейшем браузере на другом компьютере происходит тоже самое.


Если отключить все проверки, то запись удаляет, но все равно разлогинивает.
  • Вопрос задан
  • 3245 просмотров
Подписаться 3 Оценить Комментировать
Решения вопроса 1
rinat_crone
@rinat_crone
Chef Technical Officer
<%= csrf_meta_tag %> в шаблоне не забыли, случаем?
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы