Выполнение только с использованием модели People («легкий» способ):
- Pro's: это просто
- Con: это легко для людейувеличить их "выигрыши", подделав параметры формы с помощью Firebug или Chrome's Inspection tool
Предполагая, что у вас есть следующие маршруты:
new_person GET /people/new(.:format) {:action=>"new", :controller=>"people"}
edit_person GET /people/:id/edit(.:format) {:action=>"edit", :controller=>"people"}
person GET /people/:id(.:format) {:action=>"show", :controller=>"people"}
PUT /people/:id(.:format) {:action=>"update", :controller=>"people"}
DELETE /people/:id(.:format) {:action=>"destroy", :controller=>"people"}
HAML Версия кода представления:
- # Person A form
= form_tag(person_path(@personA, :loser_id => @personB), :method => :put) do
= submit_tag "Vote for Person A"
- # Person B form
= form_tag(person_path(@personB, :loser_id => @personA), :method => :put) do
= submit_tag "Vote for Person B"
Версия ERB:
<%# Person A form %>
<% form_tag(person_path(@personA, :loser_id => @personB), :method => :put) do %>
<%= submit_tag "Vote for Person A" %>
<% end %>
<%# Person B form %>
<% form_tag(person_path(@personB, :loser_id => @personA), :method => :put) do %>
<%= submit_tag "Vote for Person B" %>
<% end %>
Затем в вашем контроллере для действия update
вы можете выполнить:
def update
People.transaction do
winner = People.find(params[:id])
loser = People.find(params[:loser_id])
# Increment the winner
winner.increment! :matches_played
winner.increment! :wins
# Increment the loser
loser.increment! :matches_played
end
respond_to do |format|
format.html { redirect_to new_match_path }
end
end
Как кто-то указал в комментариях, вывероятно, следует обернуть это в так называемую транзакцию , чтобы она постоянно находилась в базе данных, только если все в транзакции успешно сохранено.
Даже при том, что я показываю вам методвыше, я все еще рекомендую использовать модель Match
.В конечном счете, использование этой дополнительной модели поможет вам проверить следующие вещи, чтобы люди не могли играть в вашу систему.
- Пользователь может голосовать только один раз за матч
- Пользователь не может голосовать заматч с их участием
- Пользователь не может подделать форму, чтобы раздуть свои выигрыши
- Разделить опасения в том, что касается моделей, и сделать ваши данные более организованными и понятными для аналитических целей
Да, все это требует больше работы (именно поэтому я не показываю код для него), но это может быть чем-то, что вы хотите сделать, если вас беспокоит что-либо из перечисленного.