【发布时间】:2015-05-09 00:23:14
【问题描述】:
当用户 #1 对用户 #2 点赞/cmets 时,用户 #2 会收到通知:
notifications/_notifications.html.erb
<%= link_to "", notification_path(notification.id), method: :delete, class: "glyphicon glyphicon-remove" %> <%= link_to Comment.find_by(notification.comment_id).user.name, user_path(Comment.find_by(notification.comment_id).user.id) %> commented on <%= link_to "your activity", (notification.activity_id) %>
但是当用户 #2 单击通知时,它不会导致任何地方,因为我删除了 activity_path,如果我将它放回 (notification.activity_id) 之前,我们会收到一个错误:
没有路线匹配 {:action=>"show", :controller=>"activities", > :id=>nil} 缺少必需的键:[:id]
我不知道这是否可能,但点击通知后,用户#2 将被带到活动所在的分页页面。通过gem will_paginate 每页有 20 个活动,因此如果评论的活动在第 2 页上,那么在单击活动后,用户 #2 应被定向到:http://0.0.0.0:3000/activities?page=2
这至少会缩小评论在用户活动源上的位置。
activities/index.html.erb
<% @activities.each do |activity| %>
<%= link_to activity.user.name, activity.user %>
<%= render "activities/#{activity.trackable_type.underscore}/#{activity.action}", activity: activity %>
<% activity.activity_likers.each do |user| %>
<%= user.name %>
<% end %>
<%= link_to like_activity_path(:id => activity.id), class: "btn", method: :post do %>
<span class='glyphicon glyphicon-thumbs-up'></span> Like
<% end %>
<%= render "comments/comments", comments: activity.comments %>
<%= render "comments/form", new_comment: Comment.new(commentable_id: activity.id, commentable_type: activity.class.model_name), create_url: :activity_comments_path %>
<% end %>
<%= will_paginate @activities %>
activities_controller.rb
class ActivitiesController < ApplicationController
def index
@activities = Activity.order("created_at desc").paginate(:page => params[:page], :per_page => 20)
end
def show
redirect_to(:back)
end
end
如果您发现可以这样做,如果您需要更多代码,请告诉我:)
更新
class NotificationsController < ApplicationController
def index
@notifications = current_user.notifications
@notifications.each do |notification|
notification.update_attribute(:read, true)
activity = Activity.find(notification.activity_id) #Gives "Couldn't find Activity with 'id'=". I then removed ".activity_id" to see what happens next.
index = Activity.order(created_at: :desc).index(activity)
page_number = (index / per_page.to_f).ceil #I am then told "undefined local variable or method `per_page'" so I tried making it :per_page to which I then get: "undefined method `to_f' for :per_page:Symbol"
end
end
def destroy
@notification = Notification.find(params[:id])
@notification.destroy
redirect_to :back
end
end
routes.rb
resources :activities do
resources :comments
resources :notifications
member do
post :like
post :notifications
end
end
更新 #2
通知/index.html.erb
<% if !@notifications.blank? %>
<%= render partial: "notifications/notification", collection: @notifications %>
<% else %>
<p>No notifications... yet</p>
<% end %>
comment.rb
class Comment < ActiveRecord::Base
after_create :create_notification
has_many :notifications
has_many :comment_likes
has_many :likers, through: :comment_likes, class_name: 'User', source: :liker
belongs_to :commentable, polymorphic: true
belongs_to :user
belongs_to :activity
private
def create_notification
@activity = Activity.find_by(self.activity)
@user = User.find_by(@activity.user_id).id
Notification.create(
activity_id: self.activity,
user_id: @user,
comment_id: self,
read: false
)
end
end
_create_notifications.rb
class CreateNotifications < ActiveRecord::Migration
def change
create_table :notifications do |t|
t.references :activity, index: true
t.references :comment, index: true
t.references :user, index: true
t.boolean :read
t.timestamps null: false
end
add_foreign_key :notifications, :activities
add_foreign_key :notifications, :comments
add_foreign_key :notifications, :users
end
end
【问题讨论】:
-
第一件事,所以不考虑你的第二个问题......当你将你的 URL 更改为
activity_path(notification.activity)时,你仍然有错误吗?
标签: ruby-on-rails ruby model-view-controller pagination will-paginate