数据库
首页 > 数据库> > javascript-在Rails中使用Ajax请求更新数据库

javascript-在Rails中使用Ajax请求更新数据库

作者:互联网

单击通知按钮后,它将向控制器发送一个get请求,该请求应该将Activity.viewed从false更新为true.这样,我的js知道不会将其填充回通知计数中.所以:

我有一个ajax GET请求

  // click EVENT TRIGGERS
  $('#bell-notices').click(function(){
    var $bell = $(this);
    $bell.find('.notifications-count').hide('0');
    $bell.parent().find('.dropdown-toggle').dropdown();
    $.get('/activities/mark_activity_viewed', function( data ) {
    });
  });

被发送到Rails控制器

  def mark_as_viewed    
    @mark = Activity.find_by(params[:id])
    @mark.viewed = true
    @mark.save!
  end

似乎一切都准备就绪,但是我无法更新数据库.

Activity.last的控制台

<Activity id: 190, user_id: 68, action: "created", targetable_id: 157, targetable_type: "Status", created_at: "2015-03-04 21:17:57", updated_at: "2015-03-04 21:17:57", commentable_id: nil, reference_id: nil, viewed: false> 

在这种情况下,user_id是创建活动的用户,而不是接收活动的用户.

解决方法:

不要使用$.get()进行更新数据的调用.而是通过PUT发送请求.由于您正在更新用户的所有活动,因此不需要执行Activity.find查找.我假设您的用户模型定义了“ has_many:activities”关联.您的JS如下所示(我正在使用coffeescript):

$('#bell-notices').click ->
  $bell = $(this)
  $bell.find('.notifications-count').hide '0'
  $bell.parent().find('.dropdown-toggle').dropdown()
  $.ajax 
      url: '/activities/mark_activity_viewed'
      type: 'put'

(作为JS):

$('#bell-notices').click(function() {
  var $bell;
  $bell = $(this);
  $bell.find('.notifications-count').hide('0');
  $bell.parent().find('.dropdown-toggle').dropdown();
  $.ajax({
    url: '/activities/mark_activity_viewed',
    type: 'put'
  });
});

在您的activity_controller中,您将拥有:

def mark_activity_viewed    
    current_user.activities.update_all(viewed: true)
    [any respond_to stuff you care to do...]
end

您需要在routes.rb中具有与“ put”匹配的路由

put 'activities/mark_activity_viewed' => 'activities#mark_activity_viewed'

请注意,上面的“ update_all”将跳过对Activity的验证,但是由于您在此处所做的只是更改布尔值,因此这不成问题.如果要对每个活动执行验证,请遍历它们并进行典型的更新并保存!

您将哪个控制器放进去实际上取决于您.我将其放在users_controller中,因为它是一个以用户为中心的操作,但是将其保留在活动控制器中没有任何问题.

标签:activerecord,javascript,ruby-on-rails
来源: https://codeday.me/bug/20191120/2045582.html