8

我在 Rails 4.0 上。

我正在发送这样的事件(注意:remote=>true):

<%= button_to 'yes', {controller:'videos', action:'rate', id: video.hashed_id, yesno:'yes'}, {:remote=>true, :class=>"rate-btn yes-btn btn btn-default btn-sm"} %>

我的控制器如下所示:

  def rate
    video = Video.find_by( hashed_id: params[:id])
    action  = params[:yesno]
    puts video.hashed_id
    puts action

    respond_to do |format|

      if (action=='yes') 
        new_rating = video.rating==1 ? 0 : 1 
        video.update( is_new:0, rating: new_rating )
        format.html { redirect_to controller:'projects', action: show, id: video.project.hashed_id }
        format.json { head :no_content }
        format.js { render :nothing=>true }

      end    

      if (action=='no') 
        new_rating = video.rating==-1 ? 0 : -1
        video.update( is_new:0, rating: new_rating )
        format.html { redirect_to controller:'projects', action: show, id: video.project.hashed_id }
        format.json { head :no_content }
        format.js { render :nothing=>true }
      end

    end

  end

我有点喜欢使用 format.json/format.html,因为我不完全理解应该从 AJAX 请求中应用哪一个。

在视图(按钮所在的位置)上,我有这个:

$(document).ready( function($) {
        console.log('ready');
    $(document).ajaxSuccess( function(data) {alert(data);} )
    $(document).ajaxError( function(data) {alert(data);} )
    $('.rate-btn').closest('form').on('ajax:success', function() {
      console.log('ajax:success!');
    });

    $('.button_to').bind("ajax:success", function() {
    console.log( 'test' );
    });

});

单击按钮后,我进入ready控制台,但无论我做什么,我都无法test在控制台中显示。我错过了什么?

更新:

我在观看 /log/development.log 时尝试单击按钮,这就是我所看到的:

Started POST "/videos/rate/lq7lv3218c/yes" for 127.0.0.1 at 2013-08-29 17:14:59 -0400
Processing by VideosController#rate as JS
  Parameters: {"authenticity_token"=>"es4wPqFrxxxxxFsbHQR/gAzofDC+ZwYsiiJ7RAQZUHk=", "id"=>"lq7lv3218c", "yesno"=>"yes"}
  [1m[36mVideo Load (0.3ms)[0m  [1mSELECT `videos`.* FROM `videos` WHERE `videos`.`hashed_id` = 'lq7lv3218c' LIMIT 1[0m
  [1m[35m (0.1ms)[0m  BEGIN
  [1m[36mSQL (0.3ms)[0m  [1mUPDATE `videos` SET `rating` = 0, `updated_at` = '2013-08-29 21:14:59' WHERE `videos`.`id` = 18[0m
  [1m[35m (0.3ms)[0m  COMMIT
  Rendered videos/rate.html.erb (0.0ms)
Completed 200 OK in 7ms (Views: 2.0ms | ActiveRecord: 1.1ms)

我是 Rails n00b,但对我来说看起来不错。

4

3 回答 3

9

button_to助手围绕提交按钮构建表单。表单是接收data-remote属性的内容(参见:http ://apidock.com/rails/ActionView/Helpers/UrlHelper/button_to ://apidock.com/rails/ActionView/Helpers/UrlHelper/button_to )。所以,我会试试这个:

$('.rate-btn').closest('form').on('ajax:success', function() {
  console.log('ajax:success!')
});      

由于您使用的是 Rails 4.0,我猜您使用的是 jQuery 1.9。事件的绑定似乎在那里发生了一些变化。因此,如果这对您以前有用,那么这可能是其中的一部分。自 1.7 以来,使用.on()事件绑定一直是首选。.bind()

于 2013-08-29T21:01:29.660 回答
0

这是为我解决问题的方法:

  1. 我在布局中加载了我自己的 jQuery(像这样:<%= javascript_include_tag "jquery-1.10.2.min", "data-turbolinks-track" => true %>它没有抛出任何错误,但显然 Rails 也在加载它自己的 jQuery 并且它们在某种程度上发生了冲突,因为当我删除我的 jQuery 时,所有的 jQuery 仍然有效,我立即是能够在视图中触发 AJAX 错误事件。但我仍然收到 ajax 错误...

  2. 我总是有一个 /views/videos/rate.html.erb 文件,只是因为我不确定它是否有必要(在 CakePHP 中是)但我没有任何东西。它是空白的。我不知道为什么,但是当我1在该视图文件中添加一个时,突然间我开始触发 ajax:success 事件。

我不明白为什么这解决了我的问题,所以如果有人能解释一下,我很想更好地理解。

于 2013-08-30T12:57:12.947 回答
0

通过捕获 ajax:completed 检查您是否收到解析错误(或类似错误)。检查status那里的论点。您还可以在jquery_ujs.js.

于 2014-04-29T22:59:35.843 回答