Прежде всего, если вы пытаетесь передать вознаграждение, этот код, вероятно, должен выглядеть следующим образом:
<%= button_to "Get This", buy_item_band_path(@band, r)%>
Я не уверен, откуда взялся бы @reward
, но r
извлечет из текущей итерации @rewards
.
Что касается вопроса, вся ваша бизнес-логика должна происходить внутри ваших моделей. Контроллеры просто для того, чтобы передавать данные в ваши модели, анализировать результаты манипуляций с моделями и сообщать Rails, какое представление необходимо отображать.
Похоже, что ваш Пользователь - это объект, который производит оплату, поэтому ваш метод оплаты, вероятно, относится к модели пользователя и должен принимать вознаграждение в качестве единственного параметра. Нет никакой явной причины привлекать модель Band вообще.
Часть вашего контроллера, которая обрабатывает этот запрос, вероятно, будет выглядеть примерно так:
def buy_item
reward = Reward.find(params[:reward_id])
if current_user.pay_for_it(reward)
# Send emails and then...
# Render something
else
# Render something that indicates an error happened
# or that the user didn't have enough points.
end
end
И ваша модель пользователя будет иметь что-то вроде:
def pay_for_it(reward)
return false unless self.points >= reward.cost
current_user.points -= reward.cost
current_user.save
end
Таким образом, User#pay_for_it
вернет true, если точки были успешно вычтены, после чего ваш контроллер может отправить электронные письма, а затем отобразить любой вид, который должен отображаться после успешной покупки.
Надеюсь, это даст вам лучшее представление о том, как организовать логику и поток управления в Rails. Модели манипулируют данными (уровень бизнес-логики), контроллеры передают информацию в уровень бизнес-логики и обратно, а представления отображают информацию.