Метод make_flaggable 'flaggings' возвращает слишком высокий уровень стека - PullRequest
2 голосов
/ 17 февраля 2012

Я пытаюсь создать кнопку «Мне нравится» для коллекции / продукта в моем приложении на основе этого урока: http://teachmetocode.com/screencasts/create-a-like-or-1-button-with-make_flaggable/

Я могу отлично следить за этим, и он прекрасно работает с симпатиями пользователей и неприязнью с помощью метода переключения кнопок и т. Д.

Тем не менее, я хочу показать, сколько «лайков» имеет коллекция / продукт, и на основе Readme это должен быть метод «маркировка». Так, например, для первой коллекции это должно быть:

Collection.first.flaggings

Однако я получаю сообщение об ошибке:

Collection Load (0.3ms)  SELECT "collections".* FROM "collections" LIMIT 1
SystemStackError: stack level too deep
    from /Users/Jeff/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/1.9.1/irb/workspace.rb:80
Maybe IRB bug!

Я пробовал поискать в Google и искать ответ по стеку и т. Д., Но безрезультатно. Я понимаю, что слишком глубокая ошибка Stack Level связана с рекурсивным / циклическим вызовом? Но я не уверен, как это относится к этому здесь.

Буду признателен за любую помощь!

Отредактировано с помощью кода из приложения:

routes.rb

showing collections and 'like'
  resources :collections do
    member do
     get 'like'
  end
end

Collection.rb

class Collection < ActiveRecord::Base
attr_accessible :name, :description, :image, :remote_image_url
belongs_to :user
has_many :products,     dependent: :destroy
has_many :events,       dependent: :destroy
mount_uploader :image, ImageUploader
make_flaggable :like


validates :name,        presence: true, length: { maximum: 100 }
validates :description, presence: true, length: { maximum: 200 }
validates :image,       presence: true 
validates :user_id,     presence: true
end

Частичный раздел users.rb

class User < ActiveRecord::Base
attr_accessible :name, :email, :password, :password_confirmation, :user_bio, 
                :shop, :cover_photo, :avatar, :remote_image_url
has_secure_password
mount_uploader :cover_photo, ImageUploader
mount_uploader :avatar, ImageUploader

make_flagger

scope :shop, where(shop: true)

has_many :posts,                    dependent: :destroy
has_many :relationships,            dependent: :destroy,
                                    foreign_key: "follower_id"
has_many :reverse_relationships,    dependent: :destroy,
                                    foreign_key: "followed_id",
                                    class_name: "Relationship"

has_many :following, through: :relationships, source: :followed 
has_many :followers, through: :reverse_relationships, source: :follower 

has_many :collections,              dependent: :destroy 

Collections_controller.rb

class CollectionsController < ApplicationController
before_filter :authenticate, only: [:create, :destroy]
before_filter :store_location, only: :show  
before_filter :current_collection, only: :show

def like
    @current_user = current_user
    @collection = Collection.find(params[:id])

    if @current_user.flagged?(@collection, :like)
        # User has liked it, let's UNlike it
        @current_user.unflag(@collection, :like)
        redirect_back_or root_path
        flash[:success] = "You have unliked this collection."           
    else
        # User has not like it yet, let's like it
        @current_user.flag(@collection, :like)
        redirect_back_or root_path
        flash[:success] = "You have liked this collection!"         
    end
end

def show
    @title = "Collection"
    collection_user_id = Collection.find(params[:id]).user_id
    @user = User.find(collection_user_id)
    @product = Product.new
    @products = Collection.find(params[:id]).products
    @collection = Collection.find(params[:id])
end

def create
    @collection = current_user.collections.build(params[:collection])
    if @collection.save
        flash[:success] = "New collection added."
        redirect_to shop_user_path(current_user)
    else
        flash[:error] = "Sorry, there seems to be an error adding your collection. Why don't you try again?"
        redirect_to shop_user_path(current_user)
    end
end

def destroy
    @collection = current_user.collections.find_by_id(params[:id])
    @collection.destroy
    flash[:success] = "Collection deleted."
    redirect_to shop_user_path(current_user)
end

private

    def current_collection
        session[:collection_id] = Collection.find(params[:id]).id.to_i
    end

end

Если вам, ребята, нужен больше код, скажите мне. Заранее спасибо за любую помощь!

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