質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

1回答

2513閲覧

rails: device+cancancan+rolify role管理をviews/users/index.html.slimで作成したい

Amkys

総合スコア17

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2019/04/18 06:25

前提・実現したいこと

標題のgemを使用し1userに対し複数roleを持つ、user管理を実装し
設定したroleに従い、ボタン表示などを制御するところまで確認できたのですが
roleの追加/変更/削除が出来るuser管理画面を作成したいです。

具体的には
http://localhost:3000/usersにアクセスし、user管理画面の一覧にて
email
role
の項目を表示させ
editボタン押下:role変更画面に遷移
deleteボタン押下:userアカウント削除
の構成で作成したいです。

試したこと

https://stackoverflow.com/questions/44626488/rails-devise-cancancan-rolify-unable-to-view-user-info-in-a-user-index-v
→同じ問題で悩まれた方がいましたが、自分の方は解決に至りませんでした。

・associationやstrong parameterでググってみましたが、解決出来ませんでした。

環境情報

サーバ:Red Hat Enterprise Linux Server release 6.8 (Santiago) Rails 5.2.2 ruby 2.6.1p33 ---gem----- devise cancancan rolify -----------

config/route.rb

Rails.application.routes.draw do get 'home/index' root to: "home#index" devise_for :users, :controllers => { :registrations => 'users/registrations', :sessions => 'users/sessions' } devise_scope :user do get "user/:id", :to => "users/registrations#detail" get "signup", :to => "users/registrations#new" get "login", :to => "users/sessions#new" get "logout", :to => "users/sessions#destroy" end resources :users end

app/views/users/index.html.slim

- model_class = User .page-header h1=t '.title', :default => model_class.model_name.human.pluralize.titleize = search_form_for @q do |f| = f.submit class: 'btn btn-default' = link_to 'Clear', url_for, class: 'btn btn-default' table.table.table-striped thead tr th = sort_link(@q, :email) th = sort_link(@q, :name) ※roleをこの列に表示したい(1userに複数roleある場合、どうなるんだろ?) tr th = f.search_field :email_cont th = f.search_field :email_cont tbody - @users.each do |user| tr td = user.email td = user.name td class="flex" = link_to ここにeditボタンをリンクしたい = link_to ここにdeleteボタンをリンクしたい end

app/controllers/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

app/controllers/users_controller.rb

class UsersController < ApplicationController load_and_authorize_resource #skip_before_action :authenticate_user, only: [:index, :new, :create] def index @q = User.ransack(params[:q]) respond_to do |format| format.html do @users = @q.result.page(params[:page]) end end end def new @user = User.new end def create @user = User.new(user_params) if @user.save redirect_to welcome_path else render :new end end private def user_params params.require(:user).permit( :email, :password, :password_confirmation, ) end end

app/models/ability.rb

# frozen_string_literal: true class Ability include CanCan::Ability def initialize(user) user ||= User.new # guest user (not logged in) if user.has_role? :admin can :manage, :all else can :read, :all end end end

app/models/role.rb

class Role < ApplicationRecord has_and_belongs_to_many :users, :join_table => :users_roles belongs_to :resource, :polymorphic => true, :optional => true validates :resource_type, :inclusion => { :in => Rolify.resource_types }, :allow_nil => true scopify end

app/models/user.rb

class User < ApplicationRecord rolify # Include default devise modules. Others available are: # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable devise :database_authenticatable, :registerable, :recoverable, :rememberable, :validatable, :trackable after_create :assign_default_role def assign_default_role self.add_role(:user) if self.roles.blank? end end

rails dbの対象テーブルとカラム情報

sqlite> pragma table_info(users);

0|id|integer|1||1 1|email|varchar|1|''|0 2|encrypted_password|varchar|1|''|0 3|reset_password_token|varchar|0||0 4|reset_password_sent_at|datetime|0||0 5|remember_created_at|datetime|0||0 6|sign_in_count|integer|1|0|0 7|current_sign_in_at|datetime|0||0 8|last_sign_in_at|datetime|0||0 9|current_sign_in_ip|varchar|0||0 10|last_sign_in_ip|varchar|0||0 11|confirmation_token|varchar|0||0 12|confirmed_at|datetime|0||0 13|confirmation_sent_at|datetime|0||0 14|unconfirmed_email|varchar|0||0 15|failed_attempts|integer|1|0|0 16|unlock_token|varchar|0||0 17|locked_at|datetime|0||0 18|created_at|datetime|1||0 19|updated_at|datetime|1||0

sqlite> pragma table_info(users_roles);

0|user_id|integer|0||0 1|role_id|integer|0||0

sqlite> pragma table_info(roles);

0|id|integer|1||1 1|name|varchar|0||0 2|resource_type|varchar|0||0 3|resource_id|integer|0||0 4|created_at|datetime|1||0 5|updated_at|datetime|1||0

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

本来は、usersのviewで、role_nameまで管理した画面にしたかったのですが
users,roles,users_rolesのviewを作成し、
sign_up後に、users_rolesのviewで権限コントロールするようにしました。

投稿2019/05/20 09:05

Amkys

総合スコア17

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問