Rails 3, как написать методы контроллера / модели для выведения определенного значения на основе связанного объекта - PullRequest
0 голосов
/ 25 января 2012

У меня есть Band has_many Награды, Награды принадлежат Бандам.

На странице показа бэнда я перебираю награды бэндов:

<% @rewards.each do |r| %>
    <b>Reward:</b>  <%= r.name %><br>
    <b>Cost:</b> <%= r.cost %><br>
    <%= button_to "Get This", buy_item_band_path(@band, @reward)%>
<% end %>

buy_item_band_path направляет к действию Band # buy_item,Я передаю @band и "r", чтобы получить доступ к обоим.

Я работаю с пользователями с помощью Devise, поэтому у меня также есть доступ к current_user.По сути, я пытаюсь заставить пользователя купить вознаграждение.У пользователей есть атрибут points, поэтому я пытаюсь сделать что-то вроде следующего в Band Model:

def pay_for_it
  unless current_user.points < self.reward.cost
    current_user.points - self.reward.cost
    current_user.save
    # SEND TWO EMAILS ONE TO THE PURCHASER AND ONE TO THE BAND ADMIN
  end
end

Этот метод модели, как мне кажется, может сработать, но я не знаю, как ссылатьсяэто в контроллере, не знаю, должен ли я, не знаю, должен ли я как-то сделать это в контроллере.

любая помощь очень ценится.

спасибо

1 Ответ

0 голосов
/ 25 января 2012

Прежде всего, если вы пытаетесь передать вознаграждение, этот код, вероятно, должен выглядеть следующим образом:

<%= 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. Модели манипулируют данными (уровень бизнес-логики), контроллеры передают информацию в уровень бизнес-логики и обратно, а представления отображают информацию.

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