使用表单RoR切换管理员用户

时间:2017-04-24 19:52:52

标签: ruby-on-rails

我正在为当前管理员创建一个切换按钮,以打开/关闭用户管理状态。根据我的理解,我将需要一些json来执行此操作,但我在此类别中非常有限,并且我只是一般编程的初学者。我正在使用rails v5.0.1和ruby v2.3.2有关我希望如何工作的信息:

  1. 管理员将访问他/她将能够搜索所有用户的用户索引

  2. 可以通过使用before_actions(在控制器中)和if / else方法(在视图中)开发的管理操作来删除或管理开/关切换管理员

  3. 注意:我的用户表是name:string,email:string和admin:boolean default:false(原因很明显)。虽然密码与摘要传递/通过确认无关紧要。

    我到处搜索但是在尝试发送修补程序请求或简单的语法错误时遇到路由问题,因为我尝试了一些新的

    用户控制器

    class UsersController < ApplicationController
        include UsersHelper
        before_action :logged_in_user, only: [:edit, :update, :index]
        before_action :correct_user, only: [:edit, :update]
        before_action :admin_user, only: [ :destroy]
    
        def index
            @users = User.paginate(page: params[:page])
        end
    
        def show
            @user = User.find(params[:id])
        end
    
        def new
            @user = User.new
        end
    
        def create
            @user = User.new(user_params)
            if @user.save
                log_in @user
                flash[:success]= "Welcome #{@user.name}!"
                redirect_to user_path(@user)
            else
                render 'new'
            end
        end
    
        def edit
            @user = User.find(params[:id])
        end
    
        def update
            @user = User.find(params[:id])
            if @user.update_attributes(user_params)
                flash[:success]= "#{@user.name} you have successfully updated account information"
                redirect_to user_path(@user)
            else
                render 'edit'
            end
        end
    
        def destroy
            User.find(params[:id]).destroy
            flash[:success] = "User deleted"
            redirect_to users_url
        end
    
            private
    
            def user_params
                params.require(:user).permit(:name, :email, :password, :password_confirmation)
            end
    
            def logged_in_user
                unless logged_in?
                    flash[:danger] = "Please log in."
                    redirect_to login_url
                end
            end
    
            # Confirms the correct user.
            def correct_user
                @user = User.find(params[:id])
                redirect_to(root_url) unless current_user?(@user)
            end
    
            def admin_user
                redirect_to(root_url) unless current_user.admin?
            end
    
            def make_admin
                @user = User.find(params[:id])
                @user.toggle!(:admin)
                redirect_to users_path
            end
    end
    

    和我的用户/ index.html.erb:

      <h1>Users Index</h1>
    <div class="container-fluid">
    <div class="col-xs-6">
    <%= will_paginate %>
    <ul class="users">
      <% @users.each do |user| %>
        <li>
          <%= gravatar_for user, size: 50 %>
          <%= link_to user.name, user %>
          <% if current_user.admin? && !current_user?(user) %> |
          <%= button_to [:make_admin, @user] do %>
          Make <%= @user.name%> an admin?
    
          <%= link_to "delete", user, method: :delete,
                                      data: { confirm: "Are you sure?" } %> |
    
        </li>
        <% end %>
        <% end %>
    </ul>
    <% end %>
    <%= will_paginate %>
    </div>
    </div>
    

1 个答案:

答案 0 :(得分:0)

首先不要让方法处于私有状态,因为这样,该方法不能直接访问,这是第一部分。只需将方法放在private行上方。

如果您的路线中有用户资源,请添加此

resources :users do
  match :make_admin, :via => [:get]
end

然后我们来看看链接

<%= link_to user_make_admin_path(user.id) do %>
  Make <%= user.name%> an admin?
<% end%>