【发布时间】:2014-09-12 00:38:13
【问题描述】:
我需要实施星级系统让users评价hotels。我以this tutorial 为例。
rating.js 文件是:
$(function() {
$('.rating_star').click(function() {
var star = $(this);
var form_id = star.attr("data-form-id");
var stars = star.attr("data-stars");
$('#' + form_id + '_stars').val(stars);
$.ajax({
type: "post",
url: $('#' + form_id).attr('action') + '.json',
data: $('#' + form_id).serialize(),
success: function(response){
console.log(response);
update_stars();
if(response["avg_rating"]){
$('#average_rating').text(response["avg_rating"]);
}
}
})
});
});
function update_stars(){
$('.star_rating_form').each(function() {
var form_id = $(this).attr('id');
set_stars(form_id, $('#' + form_id + '_stars').val());
});
}
function set_stars(form_id, stars) {
for(i = 1; i <= 5; i++){
if(i <= stars){
$('#' + form_id + '_' + i).addClass("on");
} else {
$('#' + form_id + '_' + i).removeClass("on");
}
}
}
但是这段代码不起作用,因为当我鼠标悬停或单击星星时,什么也没有发生...我认为错误在 java 代码中的某个地方,因为测试 javascript 文件工作正常。但是我找不到这个错误。
PS:ratings_controller.rb
before_filter :js_logged_in
def create
@rating = Rating.new(params[:rating])
@hotel = Hotel.find(params[:rating][:hotel_id])
respond_to do |format|
if @rating.save
format.json { render :json => { :avg_rating => @hotel.avg_rating } }
else
format.json { render :json => @rating.errors, :status => :unprocessable_entity }
end
end
end
def update
@rating = Rating.find(params[:id])
@hotel = Hotel.find(params[:rating][:hotel_id])
@rating.update_attributes(params[:rating])
respond_to do |format|
if @rating.save
format.json { render :json => { :avg_rating => @hotel.avg_rating } }
else
format.json { render :json => @rating.errors, :status => :unprocessable_entity }
end
end
end
def rating_params
params.require(:rating).permit(:stars)
end
private
def js_logged_in
if(!signed_in?)
flash[:error] = "You must be a signed in to leave a rating!"
render :js => "window.location = '/signin'"
end
end
带有评分星的页面来源包含以下行:
<script data-turbolinks-track="true" src="/assets/rating.js?body=1"></script>
UPD1: rails 错误日志的输出显示我错过了 end 语句...添加后错误发生了变化:
Started PATCH "/ratings/2.json" for 127.0.0.1 at 2014-07-19 18:52:43 +0400
Processing by RatingsController#update as JSON
Parameters: {"utf8"=>"✓", "authenticity_token"=>"7DwBNYlmmucwodZ8UDINYIaMG8Ep4sloBGEoiaiXoxQ=", "rating"=>{"hotel_id"=>"10", "user_id"=>"1", "stars"=>"5"}, "id"=>"2"}
User Load (0.3ms) SELECT "users".* FROM "users" WHERE "users"."remember_token" = '715016a7327649b3aaeb6f7e65b10996cbe1eb08' LIMIT 1
Rating Load (0.2ms) SELECT "ratings".* FROM "ratings" WHERE "ratings"."id" = ? LIMIT 1 [["id", 2]]
Hotel Load (0.1ms) SELECT "hotels".* FROM "hotels" WHERE "hotels"."id" = ? ORDER BY created_at DESC LIMIT 1 [["id", 10]]
(0.1ms) begin transaction
(0.1ms) rollback transaction
Completed 500 Internal Server Error in 21ms
ActiveModel::ForbiddenAttributesError (ActiveModel::ForbiddenAttributesError):
app/controllers/ratings_controller.rb:20:in `update'
Rendered /usr/lib/ruby/gems/1.9.1/gems/actionpack-4.1.1/lib/action_dispatch/middleware/templates/rescues/_source.erb (0.9ms)
Rendered /usr/lib/ruby/gems/1.9.1/gems/actionpack-4.1.1/lib/action_dispatch/middleware/templates/rescues/_trace.text.erb (1.1ms)
Rendered /usr/lib/ruby/gems/1.9.1/gems/actionpack-4.1.1/lib/action_dispatch/middleware/templates/rescues/_request_and_response.text.erb (5.2ms)
Rendered /usr/lib/ruby/gems/1.9.1/gems/actionpack-4.1.1/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb (72.6ms)
下一行的 rating_controller 中出现错误:
@rating.update_attributes(params[:rating])
【问题讨论】:
-
“我认为错误完全在 java 代码中”是什么意思?浏览器控制台的输出是什么?有没有 JS 错误?
-
对不起,我的意思是“某处”。不,控制台中没有错误。
-
能否显示此错误的控制台日志?
-
对不起,我不清楚。运行错误日志就是我的意思。基本上是您编写“rails server”的终端窗口当您单击星号时,您会收到内部服务器错误。让我们知道该日志中是否有错误
-
@AlMacks 请粘贴有问题的整个输出。
标签: javascript ruby-on-rails rating-system