【问题标题】:Ruby on Rails -- javascript doesn't work [duplicate]Ruby on Rails - javascript 不起作用 [重复]
【发布时间】: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

带有评分星的页面来源包含以下行:

&lt;script data-turbolinks-track="true" src="/assets/rating.js?body=1"&gt;&lt;/script&gt;

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


【解决方案1】:

您收到的错误表明您错过了文件末尾的 end 语句。

这可能是因为您的缩进错误,并且可能导致 end 语句不平衡。

这是文件的结尾:

  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

最后的end 不会关闭类定义,它会关闭def js_logged_in 方法。您没有缩进 if 的正文,与您的 def js_logged_in 匹配的 end 实际上正在关闭 if

【讨论】:

  • 你是对的,但现在有一个新错误(在我添加了'end'之后)。
  • UPD ...当我将行更改为以下内容时它消失了:@rating.update_attributes(rating_params)。谢谢!
猜你喜欢
  • 2018-07-03
  • 2011-06-17
  • 1970-01-01
  • 1970-01-01
  • 2015-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多