Добавить флажок для редактирования значения bool пользователя в devis в Rails - PullRequest
0 голосов
/ 05 мая 2019

Я создал user, используя devise gem.Я добавил столбец admin в таблицу User со значением boolean.Теперь мне нужно добавить флажки после каждого user в users_page и дать возможность, чтобы при установке флажка значение столбца admin менялось на true.Как добавить функциональность?

users_controller.rb

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

  def change_user_role    
    @user = User.find(params[:id])
    format.html { redirect_to users, notice: 'Role changed successfully' }
  end



  def destroy
    @user = User.find(params[:id])
    @user.destroy

    if @user.destroy
        redirect_to root_url, notice: "User deleted."
    end
  end
end

users_page.html.erb

<h1>Users</h1>
<% @users.each do |user| %>

  <h5><%= user.email %></h5>

  <%= user.admin %>
  <%= form_tag({controller: "users", action: "change_user_role"}, method: "get") do %>
  <%= check_box_tag(:admin, checked: false) %>
  <p><%= submit_tag 'Submit Answer' %></p>

  <% end %>
  <br>
  <%= link_to "Destroy", admin_destroy_user_path(user), method: :delete, data: { confirm: "You sure?" } %>
<% end %>

rout.rb

Rails.application.routes.draw do   

  root to: 'pages#home'
  get 'users/users_page'

  devise_for :users
  match 'users/:id' => 'users#destroy', :via => :delete, :as => :admin_destroy_user
  get 'users#change_user_role'

end

Здесь я должен передать значение флажка в users_page в change_user_role, обновить значение в db и перенаправить его в users_page.Как я могу это сделать?

1 Ответ

1 голос
/ 05 мая 2019

Прежде всего, измените ваш get метод на put в вашем rout.rb , потому что вы будете обновлять ресурс в базе данных:

Rails.application.routes.draw do   

  root to: 'pages#home'
  get 'users/users_page'

  devise_for :users
  match 'users/:id' => 'users#destroy', :via => :delete, :as => :admin_destroy_user
  // it will require user id in your url
  resources :users do
    member do
      put :change_user_role
    end
  end
end

Подробнее о маршрутах здесь

Затем измените ваш взгляд на что-то вроде этого:

<h1>Users</h1>
<% @users.each do |user| %>

  <h5><%= user.email %></h5>

  <%= form_for(user, url:  change_user_role_user_path(user)) do |f| %>
  <%= f.check_box(:admin) %>
  <p><%= f.submit 'Submit Answer' %></p>

  <% end %>
  <br>
  <%= link_to "Destroy", admin_destroy_user_path(user), method: :delete, data: { confirm: "You sure?" } %>
<% end %>

Подробнее о формах здесь

Ваш контроллер должен выглядеть примерно так:

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

  def change_user_role    
    @user = User.find(params[:id])
    // if user is updated successfully then redirect
    if(@user.update_attributes(user_params)
      format.html { redirect_to users, notice: 'Role changed successfully' }
    end
  end



  def destroy
    @user = User.find(params[:id])
    if @user.destroy
        redirect_to root_url, notice: "User deleted."
    end
  end

  // new method added to allow specific attributes only and discarding other malicious attributes that user may send
  def user_params
    params.require(:user).permit(:admin)
  end
end

Подробнее о параметрах здесь

Надеюсь, это поможет :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...