В том виде, в котором сформулировано задание, кнопка покупки никак не связана с товаром. Если же покупка зависела бы от ID товара, то можно было бы передавать этот ID в виде параметров URL'а, и вроде тоже никаких проблем. Так что проблема с покупкой сводится только к делегации прав юзеров - ограничить доступ в контроллере, и видимость во views. Поэтому все вопросы из предыдущего пунка актуальны и здесь.
Для обработки запроса покупки я создал контроллер purchases_controller, откликающийся на один единственный метод new. По логике, что new - новая покупка. Стоит ли здесь придерживаться RESTful терминологии, или же особого смысла это не имеет?
Далее, при покупке нужно считать один случайный JSON со страницы. Я считывал всю страницу через JSON.load, и делал .sample полученной коллекции для получения случайного. Просто считать со страницы случайную запись, не подгружая ее полностью кажется мне невозможным, но может быть я ошибаюсь? Насколько сильно стоит логически отделять функционал такого типа(взаимодействия с API другого приложения) в свои методы или классы от контроллера? Ошибки при покупке пользователю выдаются через flash оповещение. Значения из ссылок для проверки правильности парсил REGEX'ом, нахождения мыла юзера в .com домене проверял также.
Для отсылки писем создал purchase_mailer, с этим вроде ничего сложного. Для получения email'ов всех админов написал метод, mail to: может принимать массив адресов. Данные из контоллера в мэйлер передаются как параметры метода мэйлера.
Так как я ресетил БД после первой части, у меня не осталось не привязанных к магазину товаров, поэтому, для удобства, я добавил возможность добавлять владельцу магазина товары, не ассоциируя их со своим магазином. Тогда поле shop_name у товара просто остается пустым.