Недавно я добавил простой механизм оценки в существующий проект:
Я добавил два поля в существующую таблицу (в которой содержались элементы для оценки).Это были:
rating_score => The current score
ratings => The number of ratings which led to the score
Например, если пять пользователей проголосовали бы за «5» за текущий элемент, rating_score
было бы 25, а рейтинги - 5. Текущий рейтинг будет рассчитываться какrating_score / ratings
.
Затем я добавил к контроллеру оцениваемых предметов новый метод, называемый «скорость», который выглядел примерно так:
def rate
@item = Item.find(params[:id])
@container = "item"+@item.id.to_s
@item.rating_score += params[:rating].to_i
@item.ratings += 1
@item.save
respond_to do |format|
format.js
end
end
Мой взгляд на этот метод, называемый rate.js.erb
, будет выглядеть примерно так:
$('#<%= @container %>').html('<%= escape_javascript(render(partial: 'rating', locals: { item: @item })) %>');
Этот код работает только в том случае, если у вас установлен jQuery, но его можно легко перевести на Prototype или любой другой фреймворк JS, который вы используете.
И частичное для рейтинга, названного _rating.html.erb
, было что-то вроде:
<%= form_tag url_for(controller: 'items', action: 'rate', id: item.id), remote: true %>
<%= rating_stars(item.rating_score, item.ratings) %>
<%= item.ratings %> Votes
</form>
В этом частичном вспомогательном методе rating_stars()
была создана некая звезда-подходит для представления рейтинга, но вы можете делать это как хотите.
Установив «remote: true» в помощнике form_tag, ваша установка Rails должна автоматически передавать запрос через установленную инфраструктуру Javascript.Эта магия является частью всего ненавязчивого javascript , происходящего в Rails в последнее время, что на самом деле довольно круто.
Надеюсь, это даст вам представление о том, как реализовать очень простую систему оценки без функции блокировки IP вообще в Rails.