【问题标题】:How do i increment and display likes on a page?如何在页面上增加和显示喜欢?
【发布时间】:2016-10-30 19:48:00
【问题描述】:

我是 RoR 的新手,我正在尝试为每个特定页面上的产品设置一个 up/down like 计数器。我正在努力弄清楚如何让计数器在页面上显示

这是我的模型

class Rating < ActiveRecord::Base

    def total(total)
        @total = total
        @like = Rating.find(:like, params[:id])
        @dislike = Rating.find(:dislike, params[:id])
        @like + @dislike = total
    end
    def average(average)
        @average = average
        average.to_f = (total / 2)
    end
    def overall(overall)
        @overall = overall
        if @like > average
            overall = "More liked"
        elsif @dislike > average
            overall = "More disliked"
        else
            overall = nil
        end
    end
end

我的控制器

class RatingController < ApplicationController

    def new
        @rating = Rating.new
    end
    def index
        @rating = Rating.all
    end
    def can_rate(user_sign)
        @user_sign = user_sign
        user_signed_in? == true ? (user_sign == true) : (user_sign = false)
    end



    def like(liked)
        @liked = liked

        if can_rate?
            unless liked == true
                liked = true
                #Checks if dislike is true and subtracts it if it is
                if disliked == true
                    Rating.decrement_counter(:dislike, params[:id])
                    disliked = false
                end

                Rating.increment_counter(:like, params[:id])
                rating_id = Rating.find(params[:id])
                rating_id.save
                flash[:notice] = "You liked this!"  
            else 
                disliked = nil
                liked = nil
                Rating.decrement_counter(:like, params[:id])
                rating_id.save
            end
        else
            flash[:alert] = "You need to be signed in to use this feature!"
        end
        redirect_to :back
    end



    def dislike(disliked)
        @disliked = disliked

        if can_rate?
            unless disliked == true
                #Checks if dislike is true and subtracts it if it is
                if liked = true
                    Rating.decrement_counter(:like, params[:id])
                    liked = false
                end

                disliked = true
                Rating.increment_counter(:dislike, params[:id])
                rating_id = Rating.find(params[:id])
                rating_id.save
                flash[:notice] = "You disliked this!"
            else
                disliked = nil
                liked = nil
                Rating.decrement_counter(:like, params[:id])
                rating_id.save
            end
        else
            flash[:alert] = "You need to be signed in to use this feature!" 
        end
        redirect_to :back
    end
end

我的索引(只是测试看看它是否有效)

<h1 style='text-align: center; border-bottom: 2px solid #ddd;'>Hello world!</h1>
<div>
<%= link_to 'like',  :method => :like, :remote=>true %>
</div>

最后是我的路线

match '/rating', :to => 'rating#index', :as => :rating, via: 'get'
resources :rating

【问题讨论】:

  • 你查看过rails guide on templates吗?
  • 嗨,欢迎来到 Stack Overflow。我会指出一些小事情,看看我们可以从哪里去找出问题所在。首先:@like + @dislike = total 我什至不知道你想在这里做什么......你的意思是@total = @like.count - @dislike.count 也许是?即您是否要存储总数?如果不是——那我真的不明白,因为你不能为@like + @dislike 赋值——那是行不通的。你能解释一下你期望在那行代码上发生什么吗?
  • 在索引操作中:@rating = Rating.all 当你得到一组东西(而不是一个)时,你应该真正使用复数变量名,例如在这里你应该使用@ratings - 这是 Rails 的最佳实践,让您将来更容易看到您拥有多个。
  • user_signed_in? == true ? (user_sign == true) : (user_sign = false) 如果你有一个布尔值(例如user_signed_in?),那么你不需要明确检查它是否为真......你可以这样做:user_signed_in? ? (user_sign == true) : (user_sign = false)。如果user_sign 也是布尔值,那么您可以将其简化为user_signed_in? ? user_sign : !user_sign
  • 在您的控制器中,您有名为 like/dislike 的方法 - 但您正试图将一个名为 liked/disliked 的变量传递给它 - 这是否意味着这些方法是not 控制器操作(即您NOT 试图使用链接来访问它们)?因为您不能将这样的变量传递给控制器​​动作……如果它们不是控制器动作,那么哪个动作会调用这些方法?同样,您从其他几个方法中调用了一个名为 can_rate? 的方法...但是控制器顶部的方法称为 can_rate(user_sign) - 即完全不同...这是正确的吗?

标签: ruby-on-rails ruby view model controller


【解决方案1】:

在我使用acts_as_votable gem 摆弄各种宝石后仅花了一天时间就完成了这项工作。我正在使用solidus 作为引擎,这就是为什么从头开始制作我最初尝试做的引擎如此困难的原因

评分控制器

Spree::Product.class_eval  do
 module Spree
  class RatingsController < Spree::StoreController
    def like
        @product = Product.find(strong_prod_params)
        if spree_current_user
          if spree_current_user.voted_for?(@product) == false
            @product.liked_by spree_current_user

            registered
          elsif spree_current_user.voted_up_on?(@product)
            @product.unliked_by spree_current_user

          elsif spree_current_user.voted_down_on?(@product)
            @product.undisliked_by spree_current_user
            @product.liked_by spree_current_user

            registered
          end
        else
          flash[:notice] = "You need to be signed in to use this feature!"
        end
        redirect_to :back
      end

      def dislike
        @product = Product.find(strong_prod_params)
        #if user is signed in
       if spree_current_user
        #self explanatory
          if spree_current_user.voted_for?(@product) == false
            @product.disliked_by spree_current_user

            registered
          elsif spree_current_user.voted_down_on?(@product)
            @product.undisliked_by spree_current_user

          elsif spree_current_user.voted_down_on?(@product)
            @product.unliked_by spree_current_user
            @product.disliked_by spree_current_user

            registered
          end
        else
          flash[:notice] = "You need to be signed in to use this feature!"
        end
        redirect_to :back
      end

      def registered
        if @product.vote_registered?

          flash[:notice] = "You have rated this!"
        else
          flash[:notice] = "Something went wrong!"
        end
      end
      private
      #just some cautionary strong parameters.
      def strong_prod_params
        params.require(:product).permit(:id)
      end

    end
  end
end

处理模型和数据库在文档中。如果不起作用,请尝试将 Product.find(strong_prod_params) 替换为 Product.find(params[:id]) 如果你想知道的话,我就是这样称呼我的 like 方法

<%= link_to 'like', {:action => 'like', :controller => '/spree/ratings', :id => @product.id}, method: :put %>

这是我的路线

Spree::Core::Engine.routes.prepend do
 put '/ratings' => 'ratings#like'
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-17
    • 1970-01-01
    • 1970-01-01
    • 2012-12-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多