= Inkwell ======= Inkwell добавляет в ваше приложение возможности социальных сетей - комментарии, избранное, реблоги (репост/share), систему подписок на блоги юзеров (followers) и ленты пользователей (ленты блогов, избранного и агрегированную ленту с постами и реблогами юзеров, на которых подписан пользователь). == Требования У вас должны быть два класса: User и Post или похожие на них по назначению. Они должны быть связаны один-ко-многим. Пример: class User < ActiveRecord::Base has_many :posts end class Post < ActiveRecord::Base belongs_to :user end == Установка и настройка Добавьте в Gemfile: gem 'inkwell', :git => 'git://github.com/salkar/inkwell.git' После этого сделайте bundle install Добавьте в вашу User модель acts_as_inkwell_user и в Post модель acts_as_inkwell_post class User < ActiveRecord::Base has_many :posts acts_as_inkwell_user end class Post < ActiveRecord::Base belongs_to :user acts_as_inkwell_post end Создайте inkwell.rb файл в config/initializers и добавьте туда следующий код с названиями таблиц User и Post (или соответствующих им): module Inkwell class Engine < Rails::Engine config.post_table = :posts config.user_table = :users end end Далее, сделайте rake inkwell:install:migrations и db:migrate. == Использование === Избранное Юзер может добавлять в избранное как посты, так и комментарии: @user.favorite @post @user.favorite @comment Удаление из избранного: @user.unfavorite @post Проверка на нахождение в избранном: @user.favorite? @post Вы можете получить ленту избранного для пользователя, состоящую из добавленных им в избранное постов и комментариев (последние добавленные сверху): @user.favoriteline(:last_shown_obj_id => nil, :limit => 10, :for_user => nil) где * last_shown_obj_id - id последнего элемента уже показанной юзеру ленты. Взять его можно из item_id_in_line свойства последнего объекта из предыдущей ленты избранного. Этот параметр нужен для того, чтобы забрать часть ленты, начиная со следующего поста за указанным. Например: fline = @user.favoriteline #забрать первые 10 элементов ленты избранного юзера @user last_shown_obj_id = fline.last.item_id_in_line fline_next_page = @user.favoriteline :last_shown_obj_id => last_shown_obj_id #забрать следующие 10 элементов его ленты * limit - количество элементов возвращаемой ленты, по дефолту - 10 fline = @user.favoriteline :limit => 20 #забрать первые 20 элементов ленты избранного юзера @user * for_user - User, для которого показывается эта лента. Для него формируются свойства is_reblogged и is_favorited, которые обозначают, добавлял ли этот юзер в избранное этот элемент или делал ли его реблог. @user.favorite @another_user_post @user.reblog @another_user_post fline_for_unknown_user = @another_user.favoriteline # Для примера предположим, что fline_for_unknown_user.first == @another_user_post fline_for_unknown_user.first.is_reblogged # => false fline_for_unknown_user.first.is_favorited # => false fline_for_user_who_reblog_and_favorite_another_user_post = @another_user.favoriteline :for_user => @user # Для примера предположим, что fline_for_user_who_reblog_and_favorite_another_user_post.first == @another_user_post fline_for_user_who_reblog_and_favorite_another_user_post.first.is_reblogged # => true fline_for_user_who_reblog_and_favorite_another_user_post.first.is_favorited # => true Больше примеров можно найти в этом спеке[https://github.com/salkar/inkwell/blob/master/test/dummy/spec/functional/favorite_spec.rb]. === Реблоги (репосты) Реблог подразумевает под собой, что элемент попадет в блог самого юзера и в ленты новостей его подписчиков. Таким образом, его поведение будет аналогично поведению поста самого юзера, за исключением того, что это не его пост. Юзер может сделать реблог как поста, так и комментария: @user.reblog @post @user.reblog @comment Отмена реблога: @user.unreblog @post Проверка на наличие реблога элемента: @user.reblog? @post У реблогов нет своей ленты, они показываются в самом блоге пользователя (ленте с его постами). Больше примеров можно нати в этом спеке[https://github.com/salkar/inkwell/blob/master/test/dummy/spec/functional/reblog_spec.rb]. === Комментарии Юзер может комментировать пост или другой комментарий. Комментарий для поста создается так: @user.create_comment :for_object => @post, :body => "comment_body" Если вы хотите создать комментарий для другого комментария, необходимо добавить parent_comment_id родительского комментария: @user.create_comment :for_object => @parent_post, :body => "comment_body", :parent_comment_id => @parent_comment.id Для удаления комментария используйте destroy метод: @comment.destroy Вы можете получить ленту комментариев как для поста, так и для комментария. Она состоит из комментариев данного объекта, возвращаемых в обратном хронологическом порядке. Примечание: возвращаемый массив для простоты использования будет иметь обратную сортировку. Это связано с тем, что обычно в соц. сетях последний комментарий находится внизу, а более старые комментарии располагаются выше. Для того, чтобы получить ленту комментариев, необходимо: commentline(:last_shown_comment_id => nil, :limit => 10, :for_user => nil) где last_shown_comment_id - id последнего комментария для этого объекта из предыдущего вызова ленты комментариев. Например: cline = @post.commentline #забираем первые 10 комментариев для @post last_shown_comment_id = cline.first.id # Первый элемент берется из-за обратного порядка. По факту, это самый старый комментарий в cline. cline_next_page = @post.commentline :last_shown_comment_id => last_shown_comment_id #забираем следующие 10 комментариев для @post Limit и for_user обозначают тоже самое, что и одноименные параметры в favoriteline[https://github.com/salkar/inkwell/blob/master/README_RU.rdoc#%D0%98%D0%B7%D0%B1%D1%80%D0%B0%D0%BD%D0%BD%D0%BE%D0%B5]. Больше примеров вы можете найти в этом спеке[https://github.com/salkar/inkwell/blob/master/test/dummy/spec/functional/comments_spec.rb]. === Подписки Юзер может подписаться на другого юзера. При этом он будет видеть все его элементы блога (посты и реблоги) на своей новостной ленте. Добавление в подписки: @user.follow @another_user После этого последние 10 элементов блога @another_user появятся в новостной ленте у @user. Каждый новый элемент блога @another_user также будет добавляться в новостную ленту @user. Удаление из подписок: @user.unfollow @another_user Так можно проверить, подписан ли юзер на другого юзера: @user.follow? @another_user Для получения id юзеров, на которых подписан пользователь, и которые подписаны на него, надо сделать так: @user.followers_row @user.followings_row Оба метода возвращают массивы id. Больше примеров вы можете найти в этом спеке[https://github.com/salkar/inkwell/blob/master/test/dummy/spec/functional/following_spec.rb]. === Блог юзера Блог юзера состоит из его постов и реблогов. Он реализован лентой, идентичной favoriteline. Получить его можно так: @user.blogline(:last_shown_obj_id => nil, :limit => 10, :for_user => nil) где параметры идентичны описанным ранее favoriteline параметрам[https://github.com/salkar/inkwell/blob/master/README_RU.rdoc#%D0%98%D0%B7%D0%B1%D1%80%D0%B0%D0%BD%D0%BD%D0%BE%D0%B5]. Больше примеров вы можете найти в этом спеке[https://github.com/salkar/inkwell/blob/master/test/dummy/spec/functional/blogline_spec.rb]. === Timeline feature Новостная лента юзера состоит из элементов блогов юзеров, на которых этот юзер подписан. Получить ее можно так: @user.timeline(:last_shown_obj_id => nil, :limit => 10, :for_user => nil) где параметры идентичные описанным ранее favoriteline параметрам[https://github.com/salkar/inkwell/blob/master/README_RU.rdoc#%D0%98%D0%B7%D0%B1%D1%80%D0%B0%D0%BD%D0%BD%D0%BE%D0%B5]. Больше примеров вы можете найти в этом спеке[https://github.com/salkar/inkwell/blob/master/test/dummy/spec/functional/timeline_spec.rb].