2013-10-26 2 views
0

У меня есть полиморфная модель TimeReport. Вы можете иметь либо внутренние TimeReport, либо TimeReports, связанные с проектом. Однако, если у вас есть TimeReport, связанный с проектом, вы можете связать его только с проектом, к которому вы принадлежите.CanCan на полиморфных моделях

Итак, как бы я мог CanCan это? Я не могу действительно делать

can :create, TimeReport, project_id: user.project_ids 

как я бы хотел с самого начала .. Любые советы? (Я мог бы, конечно, сделать это в правилах проверки модели, но я бы предпочел, если нет веских причин.)

ответ

1

Возможно, вам нужно предоставить дополнительную информацию, чтобы получить хороший ответ ... Вы говорите, что time_report связан с проектом, чтобы существовало значение time_report.project?

В контроллере:

@time_report = TimeReport.new # or whatever 
    authorize! :create, @time_report 

В Способности:

can [ :create ], TimeReport do |time_report| 
    user.project_ids.include? time_report.project_id 
    end 

Обратите внимание на следующее:

  • вы, вероятно, не может использовать load_and_authorize_resource, но, возможно, вы можете. Я стараюсь не использовать его, но если @time_report - это именно тот, который вам нужен, тогда это сработает.

  • переменной time_report, который получает пройденной внутри can() в вашей способности является один и тот же с @time_report в контроллере. Это то, что делает CanCan красивым;)

+0

Не знал, что вы можете выполнить блок в CanCan вот так! Качественный товар! –

Смежные вопросы