2016-11-04 72 views
1

我有一個帶有實習消息系統的rails應用程序。用戶可以發送消息給其他用戶。例如:用戶1發送消息用戶2可以反之亦然。將通知添加到RoR消息收件箱系統

所有作品都完美無缺。但我想用notfications功能性來升級這個系統。我想通知類型:

1)在導航欄 2)通過郵件

問題:我不知道我能做到這一點。

你能幫助我嗎?

對話表

class CreateConversations < ActiveRecord::Migration 
def change 
    create_table :conversations do |t| 
    t.integer :sender_id 
    t.integer :recipient_id 
    t.timestamps 
    end 
end 
end 

信息表。在這段代碼中我有一個布爾值:read。我認爲解決方案可以在這裏。你怎麼看待這件事 ?

class CreateMessages < ActiveRecord::Migration 
def change 
    create_table :messages do |t| 
    t.text :body 
    t.references :conversation, index: true 
    t.references :user, index: true 
    t.boolean :read, :default => false 
    t.timestamps 
    end 
end 
end 

conversation.rb

class Conversation < ActiveRecord::Base 
belongs_to :sender, :foreign_key => :sender_id, class_name: 'User' 
belongs_to :recipient, :foreign_key => :recipient_id, class_name: 'User' 
has_many :messages, dependent: :destroy 
validates_uniqueness_of :sender_id, :scope => :recipient_id 
scope :between, -> (sender_id,recipient_id) do 
where("(conversations.sender_id = ? AND conversations.recipient_id =?) OR (conversations.sender_id = ? AND conversations.recipient_id =?)", sender_id,recipient_id, recipient_id, sender_id) 
end 
end 

Message.rb

class Message < ActiveRecord::Base 
belongs_to :conversation 
belongs_to :user 
validates_presence_of :body, :conversation_id, :user_id 
def message_time 
    created_at.strftime("%m/%d/%y at %l:%M %p") 
end 
end 

conversations_controller.rb

class ConversationsController < ApplicationController 
    before_action :authenticate_user! 

    # GET /conversations 
    # GET /conversations.json 
    def index 
    @users = User.all 

    # Restrict to conversations with at least one message and sort by last updated 
    @conversations = Conversation.joins(:messages).uniq.order('updated_at DESC') 
    end 

    # POST /conversations 
    # POST /conversations.json 
    def create 
    if Conversation.between(params[:conversation][:sender_id], params[:conversation][:recipient_id]).present? 
    @conversation = Conversation.between(params[:conversation][:sender_id], params[:conversation][:recipient_id]).first 
    else 
    @conversation = Conversation.create!(conversation_params) 
    end 

    redirect_to conversation_messages_path(@conversation) 
end 

    private 
    # Use callbacks to share common setup or constraints between actions. 
    def conversation_params 
     params.require(:conversation).permit(:sender_id, :recipient_id) 
    end 
end 

messages_controller.rb

class MessagesController < ApplicationController 
    before_action do 
    @conversation = Conversation.find(params[:conversation_id]) 
    end 
def index 
@messages = @conversation.messages 
    if @messages.length > 10 
    @over_ten = true 
    @messages = @messages[-10..-1] 
    end 
    if params[:m] 
    @over_ten = false 
    @messages = @conversation.messages 
    end 
if @messages.last 
    if @messages.last.user_id != current_user.id 
    @messages.last.read = true; 
    end 
end 
@message = @conversation.messages.new 
end 
def new 
@message = @conversation.messages.new 
end 
def create 
@message = @conversation.messages.new(message_params) 
if @message.save 
    redirect_to conversation_messages_path(@conversation) 
end 
end 
private 
def message_params 
    params.require(:message).permit(:body, :user_id) 
end 
end 

/conversations/index.html.erb

<div class="ui segment"> 
<h3>Mailbox</h3> 
<div class="ui list"> 
    <div class="item"> 
    <% @conversations.each do |conversation| %> 
    <% if conversation.sender_id == current_user.id || conversation.recipient_id == current_user.id %> 
    <% if conversation.sender_id == current_user.id %> 
     <% recipient = User.find(conversation.recipient_id) %> 
    <% else %> 
     <% recipient = User.find(conversation.sender_id) %> 
    <% end %> 
    Conversation avec <%= link_to recipient.prenom, conversation_messages_path(conversation)%> 
    <% end %> 
    <% end %> 
    </div> 
</div> 
</div> 
<div class="ui segment"> 
<h3>All Users</h3> 
    <div class="ui list"> 
    <% @users.each do |user| %> 
    <% if user.id != current_user.id %> 
    <div class="item"> 
    <%= user.prenom %> <%= button_to 'Message me', conversations_path(conversation: { sender_id: current_user.id, recipient_id: user.id }), class: 'btn btn-primary m-t' %> 
</div> 
    <% end %> 
<% end %> 
</div> 
</div> 

消息/ index.html.erb

<% if @over_ten %> 
<%= link_to 'Show Previous', "?m=all" %> 
<% end %> 
<div class="ui segment"> 
<% @messages.each do |message| %> 
    <% if message.body %> 
    <% user = User.find(message.user_id) %> 
    <div class="item"> 
    <div class="content"> 
    <div class="header"><strong><div class="imageavatarmessage"><%= image_tag user.avatar(:thumb), class:"imageavatarmessage" %></div><%= user.prenom %></strong>  <%= message.message_time %></div> 
     <div class="list"> 
     <div class="item"> 
     <i class="right triangle icon"></i> 
     <%= message.body %> 
     </div> 
    </div> 
    </div> 
</div> 
<% end %> 
<% end %> 
</div> 
<%= form_for [@conversation, @message], html: {class: "ui reply form"} do |f| %> 
<div class=」field」> 
    <%= f.text_area :body, class: "form-control" %> 
</div> 
<%= f.text_field :user_id, value: current_user.id, type: "hidden" %> 
<div> 
    <%= f.submit "Add Reply", class: "ui blue labeled submit icon button" %> 
</div> 
<% end %> 

回答

1

我建議你去通過本教程打造漂亮的通知系統 https://www.devwalks.com/lets-build-instagram-part-6-notifications/

基本上,你必須創建新的模型,設置與你的Message模型的依賴關係,並整合t o控制器

對於電子郵件通知,它更簡單。 只需創建新的郵件,並啓動它在創建行動messages_controller

def create 
@message = @conversation.messages.new(message_params) 
if @message.save 
    SendMessageMailer.new_message(@message).deliver_later 
    redirect_to conversation_messages_path(@conversation) 
end 
end 

編輯: 要創建郵件,你應該做這樣的事情:

rails g mailer SendMessage 

轉到/應用/郵寄/ send_message_mailer。RB,並添加動作,如控制器

def new_message(message) 
    @message = message 
    mail(to: @message.user.email, subject: 'Hey! Here is what you missed') 
end 

而且同一類型的建築物,創建一個視圖(電子郵件模板)和代碼與僱員再培訓局代碼

app/views/send_message_mailer/new_message.html.erb 

Im不去深入到這一點,我想你可以弄清楚如何傳遞間隔(假設用戶在線或閱讀郵件時不發送)並區分接收者/發件人用戶

郵件程序再一次是同一類型的控制器。因爲您可以根據需要通過儘可能多的PARAMS和郵件控制器和視圖

郵件內使用模型嵌套

def new_message(message, sender, receiver) 
end 

控制器

SendMessageMailer.new_message(@message, @message.user, params[:receiver]).deliver_later 
+0

哎@謝爾蓋 - khmelevskoy感謝這個鏈接,併爲這條評論。梅勒就是這樣簡單? – nicolaswecandoit

+0

非常多。和往常一樣,官方指南是一個很好的參考.http://guides.rubyonrails.org/action_mailer_basics.html –

+0

我真的很感謝你的編輯!感謝這:) – nicolaswecandoit