Другое представление экземпляра модели для контроллера - PullRequest
0 голосов
/ 01 ноября 2011

Мне интересно, есть ли способ по-разному представлять модель (или, возможно, контролировать доступ на уровне полей) в зависимости от ее состояния (экземпляра модели) и контроллера, использующего ее.

Пример:

Представьте, что у нас есть модель Order с полями product_id, count, price и status.status может быть одним из: :new, :confirmed, :accepted, :cancelled, :delivered и :closed.

Приложение может получить доступ к Order, скажем, с двух контроллеровCustomerOrdersController и SellerOrdersController.Таким образом, CustomerOrdersController может создавать и редактировать заказы.Но в состоянии изменить только count поле.С другой стороны, SellerOrdersController может редактировать заказы.Но в состоянии изменить только ценовое поле.Т.е. было бы замечательно, если бы экземпляр класса Order, с которым работает CustomerOrdersController, не имел метода price=.То же самое для count= (product=) и SellerOrderController.

Дальнейший набор столбцов, разрешенных для редактирования, зависит от поля состояния (вероятно, работает для некоторого конечного автомата).

Итак,вопрос: как бы вы сделали это в своем приложении?

PS

Я думаю о некоторых ActiveModel прокси-объектах для ActiveRecord случаи, но не знаю, на самом деле это будет работать или нет.Рассмотрим:

class CustomerOrderProxy < ActiveModel::Base end
class SellerOrderProxy < ActiveModel::Base end

class Order < ActiveRecord::Base
  def wrap_proxy(controller_user)
    controller_user == CustomerOrdersController ? CustomerOrderProxy(self) : SellerOrderProxy(self)
  end
end

Другой подход заключается в том, чтобы выполнять тонны проверок и params проверок внутри действий контроллера, но я не хочу.Я верю в "Толстую модель - тощий контроллер":)

PPS

Я знаю, что в ruby ​​есть много плагинов конечных автоматов, но AFAI понимает, что они определяют только переходы, а ненабор методов (т.е. представление) объекта.

Ответы [ 2 ]

0 голосов
/ 04 ноября 2011

Похоже, я нашел подходящее решение: в скринкасте Райана Бейтса Динамический attr_accessible

Обновление:
В Rails 3.1 update_attributes(params[:order], role) можно было бы использовать. Проверьте рельсы API . Хотя его нельзя использовать для изменения контроля доступа в соответствии с состоянием объекта.

0 голосов
/ 01 ноября 2011

Это звучит как простой контроль доступа.Доступ предоставляется на основании авторизованного пользователя, а не того, какой контроллер используется.Взгляните на камень cancan для реализации чистого декларативного управления доступом для ваших объектов AR.

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