【发布时间】: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