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