CanCan, настройка вложенного ресурса? - PullRequest
0 голосов
/ 27 июля 2011

У меня есть следующие модели:

Group (id)
Poll (id, group_id)
PollVote (id, poll_id)

Я не хочу делать глубокое вложение, то есть я не хочу / group /: id / poll /: id / poll_vote /: id

Я хочу настроить его так, чтобы мои маршруты:

/group/:id
/poll/:id
/poll/:id/poll_vote/:poll_vote_id

У меня работает опрос, но я не могу понять, как заставить работать PollVote ... Пока у меня есть:

class PollVotesController < ApplicationController

  # Authorization w Devise & CanCan
  before_filter :authenticate_user! # Devise, signed in users only
  load_and_authorize_resource :poll # CanCan
  load_and_authorize_resource :poll_vote, :through => :poll

  # We need to pass along the wall
    def current_ability
        @current_ability ||= Ability.new(current_user, @poll.group_id)
    end

Затем в able.rb

can [:manage], Poll do |poll|
    This returns TRUE is the user is a group member of the poll
end

Что я использую в PollVotes, чтобы PollVotes проверял CanCan с помощью Poll?

Спасибо

1 Ответ

1 голос
/ 27 июля 2011

Вы не показали свою пользовательскую <-> групповую ассоциацию, поэтому, если User has_and_belongs_to_many :groups, тогда:

can :manage, [ Poll ] { |poll| user.groups.include?(poll.group) }

Конечно, вы, вероятно, хотите заблокировать это только для голосов, связанных с пользователем.

Редактировать - вот примеры ограничения доступа к созданию и редактированию голосов для голосования:

can :read, PollVote # not needed if you have e.g. can :read, :all
can :create, [ PollVote ] { |poll_vote| user.groups.include?(poll_vote.poll.group) }
can [ :edit, :destroy ], [ PollVote ] { |poll_vote| poll_vote.user_id == user.id }
...