rails + devise + cancancan + rolify - невозможно просмотреть информацию о пользователе в представлении индекса пользователя

Моя цель состоит в том, чтобы на панели навигации была включена опция меню User Admin, если текущий пользователь является администратором. Пользователь с правами администратора может выбрать это, и он будет перенаправлен на путь users_path, который в маршрутах rails:

users GET /users(.:format) users # index

В app/views/users/index.html.erb находится таблица, которая отображает имя пользователя и адрес электронной почты в настоящее время. Конечная цель также состоит в том, чтобы иметь флажок администратора, чтобы пользователь-администратор мог проверить это в отношении пользователя, чтобы изменить роль на "администратор" после того, как он будет отправлен этому пользователю. В основном это страница администрирования пользователей для администрирования других пользователей.

Однако на данный момент в таблице есть только поля имени пользователя и адреса электронной почты. Проблема в том, что в этой таблице нет данных. Это пусто. НО, когда я использую отладку, я вижу все данные на панели отладки, когда страница загружается. страница индекса пользователя с пустой таблицей, но панель отладки, заполненная данными пользователя

Вот как это в настоящее время настроено:

1) rout.rb:

devise_for :users resources :users, only: [:index]

2) users_controller.rb

class UsersController < ApplicationController
  load_and_authorize_resource
  def index
    @users = User.all
  end
end

3) index.html.erb

<table id="user_list" class="display table table-striped table-sm table-hover" cellspacing="0" width="100%" >
  <thead>
     <tr>
       <th>Username</th>
       <th>Email</th>
      </tr>
   </thead>
   <tbody>
     <% @users.each do |user| %>
       <tr>
         <td><%= user.username%></td>
         <td><%= user.email %></td>
       </tr>
     <% end %>
   </tbody>
</table>

4) модель пользователя:

class User < ApplicationRecord
  rolify
  devise :database_authenticatable, :rememberable, :trackable, :registerable
  attr_accessor :username, :email, :password, :password_confirmation, :remember_me, :firstname, :lastname
  after_create :assign_default_role
  def assign_default_role
    self.add_role(:user) if self.roles.blank?
  end
end

5) application_controller.rb

class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception
  before_action :authenticate_user!
  protected
  def configure_permitted_parameters
    added_attrs = %i[username email password password_confirmation remember_me]
    devise_parameter_sanitizer.permit :sign_in, keys: added_attrs
  end
end

6) класс канканских способностей

class Ability
  include CanCan::Ability
  def initialize(user)
    if user.has_role? :admin
      can :manage, :all
    else
      can :read, :all
    end
  end
end

Есть идеи, что мешает отображению пользовательских данных в index.html.erb?

1 ответ

Нашел проблему. Я использовал attr_accessor в пользовательской модели и строгие параметры в user_controller.

attr_accessor устарел и заменен сильными параметрами в Rails 4. Вам не нужны оба. После удаления attr_accessor данные заполнили таблицу в представлении индекса пользователя.

Другие вопросы по тегам