2009-06-26 7 views
1

내 webapp에 사용자가 등록되어 있고 기사, 블로그 게시물, 수다쟁이도 있습니다. 이러한 모든 리소스에 대해 아래에 나열된 다형성 설명 모델을 사용합니다.레일에있는 사용자에게 알림을 보내시겠습니까?

id content   commentable_id commentable_type user_id created_at updated_at 
1 Frist comment 2    Article   1  .... 
2 Second comment 3    Post    2  ..... 

각 주석 가능 자원에 대해 사용자가 주석을 달 수있는 주석 가능 자원 하단에 의견 양식이 있습니다. 체크 박스를 사용하려면 댓글을 제출하는 동안 선택하면 나중에 다른 새로운 댓글이 추가 될 때 사용자가 이미 가입 했으므로받은 편지함이나 이메일에 알림을 받아야합니다.

은 내가 알림이 일치 commentable 및 사용자와 함께 만든 새 의견이있을 경우 전송되어야 누구에 commentable_type, commentable_id 및 USER_ID을 (저장할 수 알림과 같은 몇 가지 모델을 갖고 싶어?

어떻게 Comment와 Notification 사이의 연결을 구현합니다. 특정 주석 가능 자원에 가입 한 사람이 있는지 확인하는 부분은 after_create hook을 사용하여 CommentObserver를 만들고 일치하는 레코드가 있으면 검색을 초기화하고 알림을 보냅니다.

하지만 나는 그것을 성취하기 위해 협회, 모델, 관제사 및 견해가 어떻게 생겼는지 혼란 스럽다. 그는 모델이 이미 다형 적이라고 말하면서, 다형성으로 Notification 모델을 만들 수 있습니까 ??

답변

6

플러그인 없이도이 작업을 쉽게 수행 할 수 있습니다. 게시물에 대한 사용자 알림 구독을 저장할 데이터베이스 테이블을 만듭니다. 그런 다음 주석을 작성할 때마다 데이터베이스를 쿼리하고 모든 사용자의 주소에 ActionMailer을 사용하여 전자 메일을 보내십시오. 알림을 사용자, 포스트 및 코멘트 모델 :

1

첫 번째 단계는이되면

$ rails g model Notification post:references comment:references user:references read:boolean 

    $ rake db:migrate 
    $ rails g controller Notifications index 

이 완료 통지를 새로운 모델과 컨트롤러를 만드는 것입니다, 다음 단계는 has_many를 추가합니다. 이 작업이 완료되면

, 주석 모델에 다음 코드를 추가합니다 :

 after_create :create_notification 

     private 

     def create_notification 
      @post = Post.find_by(self.post_id) 
      @user = User.find_by(@post.user_id).id 
      Notification.create(
      post_id: self.post_id, 
      user_id: @user, 
      comment_id: self, 
      read: false 
      ) 
     end 

위의 코드 조각은 한 번 주석이 생성되는 알림을 만들 수 있습니다. 알림이 삭제 될 수 있으며, 사용자가 읽은 상태로 알림 표시 할 수 있도록 다음 단계는 알림 컨트롤러를 편집하는 것입니다 : 알림을 삭제하는 방법을 설정

 def index 
     @notifications = current_user.notications 
     @notifications.each do |notification| 
     notification.update_attribute(:checked, true) 
     end 
    end 

     def destroy 
     @notification = Notification.find(params[:id]) 
     @notification.destroy 
     redirect_to :back 
     end 

다음 일은 할을 때 코멘트 삭제됨 :

  def destroy 
      @comment = Comment.find(params[:id]) 
      @notification = Notification.where(:comment_id => @comment.id) 
      if @notification.nil? 
       @notification.destroy 
      end 
      @comment.destroy 
      redirect_to :back 
     end 

마지막으로 할 일은 몇 가지보기를 만드는 것입니다. 원하는 것을 무엇이든 할 수 있습니다.

관련 문제