4

これは Rails 4 に関するフォローアップの質問です: CanCanCan 機能 with has_many :through アソシエーション。コンテキストがわずかに変更され、4 回の更新後、最初の質問のコードもかなり異なっていると思われるため、ここで問題を再度述べます。

Undefined method 'role?'などの他の質問も確認しました。Userの場合、しかしそれは私の問題を解決しませんでした。

では、次の 3 つのモデルを用意します。

class User < ActiveRecord::Base
  has_many :administrations
  has_many :calendars, through: :administrations
end

class Calendar < ActiveRecord::Base
  has_many :administrations
  has_many :users, through: :administrations
end

class Administration < ActiveRecord::Base
  belongs_to :user
  belongs_to :calendar
end

与えられたcalendarに対して、 にuserは があり、これは結合モデル ( という名前の列)roleで定義されています。administrationrole

calendarに対して、userは次の 3 つroleの のうちの 1 つだけを持つことができます: 所有者、編集者、または閲覧者。

これらの役割は現在、辞書や定数には保存されず、administrationさまざまな方法で文字列 ("Ower"、"Editor"、"Viewer") としてのみ割り当てられます。

Userモデルの認証は を通じて処理されDevisecurrent_userメソッドは機能しています。

ログインした のみがuserアプリ内リソースにアクセスできるようにするために、およびコントローラーにbefore_action :authenticate_user!メソッドを既に追加しています。calendarsadministrations

ここで、役割ベースの承認システムを実装する必要があるため、CanCanCangem をインストールしました。

これが私が達成したいことです:

  • すべての (ログインしている)は、新しいuserを使用できます。createcalendar
  • auserが a の であるowner場合、自分の を含め、this に属するすべての およびをcalendar使用できます。managecalendaradministrationcalendaradministration
  • ausereditora の場合、 calendarhe はreadupdatethis calendar、およびdestroyhis administration.
  • auserviewera の場合、calendar彼はreadこれを行うことができcalendardestroy彼のadministration.

上記を実装するために、次のability.rbファイルを作成しました。

class Ability
  include CanCan::Ability

  def initialize(user)
    user ||= User.new
    if user.role?(:owner)
      can :manage, Calendar, :user_id => user.id
      can :manage, Administration, :user_id => user.id
      can :manage, Administration, :calendar_id => calendar.id
    elsif user.role?(:editor)
      can [:read, :update], Calendar, :user_id => user.id
      can :destroy, Administration, :user_id => user.id
    elsif user.role?(:viewer)
      can [:read], Calendar, :user_id => user.id
      can :destroy, Administration, :user_id => user.id
    end    
  end
end

ログインして任意のカレンダー ページ (インデックス、表示、編集) にアクセスしようとすると、次のエラーが表示されます。

NoMethodError in CalendarsController#show
undefined method `role?' for #<User:0x007fd003dff860>
def initialize(user)
    user ||= User.new
    if user.role?(:owner)
      can :manage, Calendar, :user_id => user.id
      can :manage, Administration, :user_id => user.id
      can :manage, Administration, :calendar_id => calendar.id

user問題は、 arole自体がなく、特定の に対してのみrole定義されているという事実に起因すると思いcalendarます。

NoMethodErrorこれは、 for がrole?onになる理由を説明していuserます。

したがって、問題は次のようになります。user role特定の をチェックする方法はcalendar?

物事を機能させる方法はありますか?

4

1 に答える 1

2

role?以下のように、ユーザーモデルにメソッドが必要です-

class User < ActiveRecord::Base
  has_many :administrations
  has_many :calendars, through: :administrations

  def role?(type)
     administrations.pluck(:role).include?(type.to_s)
  end
end
于 2015-09-02T16:47:44.407 に答える