【发布时间】:2016-11-16 12:39:45
【问题描述】:
我的应用中有通知系统。当用户转到其他用户的页面(用户/显示页面)时,通知计数会减少,因为他/她可以看到公共聊天窗口。因此,例如,如果 sby 给您发短信,那么您有 1 条通知。当您进入发件人的显示页面时,您的通知将减少到 0。
一切正常,但我想重构代码,因为它变得杂乱无章。
您可以在下面看到旧代码和新代码。旧代码工作正常,但新代码存在一个奇怪的问题。当我到达用户页面并在控制器显示操作或模板中打印出current_user.new_chat_notification 属性时(我将其显示在标题中,因此它在每个页面上都可用)它显示 1。与此同时,如果我打印出控制台中的数字显示为 0。因此由于某种原因,数据库中的数字减少了,但控制器操作和视图不及时知道它。如果我转到其他页面,那么数字会降为零。所以下一个控制器动作已经知道数字减少并显示为0。我真的不明白旧代码和新代码之间有什么区别会导致这样的事情。
schema.rb
create_table "users", force: :cascade do |t|
t.integer "new_chat_notification", default: 0
end
用户控制器
def show
@user = User.find(params[:id])
#FOLLOWING 3 LINES ARE PART OF THE UPDATE
@conversation = Conversation.create_or_find_conversation(current_user.id, @user.id)
@tasks = Task.uncompleted.between(current_user.id, @user.id).order("created_at DESC").includes(:assigner, :executor).paginate(page: params[:page], per_page: 14)
@messages = @conversation.messages.includes(:user).order(created_at: :desc).limit(50).reverse
current_user.decreasing_chat_notification_number(@user)
respond_to do |format|
format.html
format.js { render template: "tasks/between.js.erb" }
end
end
用户.rb
#FOLLOWING 2 LINES ARE PART OF THE UPDATE
has_many :notifications, foreign_key: "recipient_id", dependent: :destroy
validates :new_chat_notification, numericality: { only_integer: true, greater_than_or_equal_to: 0 }
def decreasing_chat_notification_number(sender)
notification = notifications.between_chat_recipient(sender).unchecked.first
checking_and_decreasing_notification(notification) if notification.present?
end
def checking_and_decreasing_notification(notification)
notification.check_notification
if notification.notifiable_type == "Message"
# decrease_new_chat_notifications --> OLD CODE THAT WORKING PROPERLY
NotificationSender.new(notification).decrease_new_chat_notifications # --> NEW CODE NOT WORKING PROPERLY
....
else
....
end
end
def decrease_new_chat_notifications
decrement!(:new_chat_notification) if new_chat_notification > 0
end
notification_sender.rb(用于新代码)
class NotificationSender
attr_reader :notification, :recipient
def initialize(notification)
@notification = notification
@recipient = notification.recipient
end
def decrease_new_chat_notifications
recipient.decrement!(:new_chat_notification) if recipient.new_chat_notification > 0
end
end
【问题讨论】:
标签: ruby-on-rails model-view-controller model controller