Разработка для Ruby on Rails: @users равен нулю, когда требуется одобрение администратора

Я настраиваю приложение (Rails 5), в котором пользователи должны быть одобрены администратором. Я следовал инструкциям на странице https://github.com/plataformatec/devise/wiki/How-To%3a-Require-admin-to-activate-account-before-sign_in при настройке всего, но я получаю NoMethodError undefined метод each» для nil:NilClass всякий раз, когда я пытаюсь перебрать @users. Вот мой файл users_controller.rb

def index
  if params[:approved] == "false"
    @users = User.find_by_approved(false)
  else
     @users = User.all
  end
end

модель пользователя user.rb

class User < ApplicationRecord
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
     :recoverable, :rememberable, :trackable, :validatable, :confirmable

  def active_for_authentication?
    super && approved?
  end

  def inactive_message
    if !approved?
      :not_approved
    else
      super
    end
  end
end

маршруты.rb

Rails.application.routes.draw do
  devise_for :admins
  devise_for :users, except: [:index]
  resources :users, only: [:index]

  get 'home/index'

  get 'home/about'

  get 'home/products'

  get 'home/agents'

  get 'home/contact'

  get 'home/documents'

  get 'users/admin_page'

  root 'home#index'

end

и таблица с моего взгляда на users/admin_page.html.erb

<%= link_to "All Users", :action => "index" %>|
<%= link_to "Users awaiting approval", :action => "index", :approved => "false" %>
 <table>
     <% @users.each do |user| %>
     <tr>
        <td><%= user.email %></td>
        <td><%= user.approved %></td>
        <td><%= link_to "Edit", edit_user_path(user) %></td>
     </tr>
     <% end %>
 </table>

Я искал другие решения или причины, по которым @users не будет определен, но ничего не могу найти.


person Jacob Jackson    schedule 21.07.2016    source источник
comment
Попробуйте изменить @users = User.find_by_approved(false) на @users = User.where(approved: false) и посмотрите, решит ли это вашу проблему.   -  person mrvncaragay    schedule 22.07.2016
comment
Я только что попробовал это, и он все еще отображается как ноль. Я также попытался полностью удалить эту часть и просто определить ее как @users = User.all, и это также оказалось неопределенным.   -  person Jacob Jackson    schedule 22.07.2016


Ответы (2)


Методы find_by_ предназначены для возврата одного объекта или nil, если он не существует. Вам нужна вся коллекция пользователей, которые еще не были одобрены.

@users = User.where(approved: false)
person Sam Coles    schedule 22.07.2016

Я понял. Я неправильно назвал свой метод в UsersController. Мое представление называется admin_page.rb, но я назвал свой метод index. Спасибо всем кто ответил.

person Jacob Jackson    schedule 26.07.2016