在 rails 4 中从头开始构建具有多个收件人的消息传递系统

Building an messaging system from scratch with multiple recipients in rails 4

我一直在尝试为我的站点构建一个消息传递系统,该系统使用 devise 进行身份验证。它需要的功能是能够将消息发送给一个或多个收件人(最好也使用清单形式列出用户)。搜索了一段时间后,我发现了几个 gem,比如 mailboxer,但我不需要它的所有功能,而是想构建自己的系统来学习(在 rails 还是个新手)。

我遵循了这个古老的教程 (http://web.archive.org/web/20100823114059/http://www.novawave.net/public/rails_messaging_tutorial.html)。我意识到这是一个非常古老的教程,但它是我能找到的唯一一个符合我想要实现的目标的教程。

我已经按照教程进行了 T 甚至在我的代码不起作用后复制并粘贴了教程中的代码。

尝试访问 http://localhost:3000/mailbox 时,我在 MailboxController#index

中收到 NoMethodError
undefined method `messages' for nil:NilClass
app/controllers/mailbox_controller.rb:12:in `show'
app/controllers/mailbox_controller.rb:6:in `index'

我也参考了这个问题Rails 3: undefined method messages for Folder,它和我有同样的错误,但是这个话题似乎没有任何意义。

mailbox_controller.rb

  class MailboxController < ApplicationController

  def index

    @folder = current_user.inbox
    show
    render :action => "show"
  end

  def show
    @folder ||= current_user.folders.find_by(params[:id])
    @messages = @folder.messages :include       => :message, :order => "messages.created_at DESC"
  end
end

models/folder.rb

class Folder < ActiveRecord::Base
  acts_as_tree
  belongs_to :user
  has_many :messages, :class_name => "MessageCopy"
end

任何帮助都会很棒,如果您需要更多信息,请告诉我,post。

我最终通过一些修改弄清楚了消息系统。我想 post 我的整个解决方案,因为它给我带来了困难并且可能对其他人有用。我保持它非常简单,没有包括首先给我带来问题的文件夹模型,但是 none 它的功能越少。

这是我的联想

model/message.rb

attr_reader :user_tokens

belongs_to :sender, :class_name => 'User'
has_many :recipients
has_many :users, :through => :recipients

def user_tokens=(ids)
    self.user_ids = ids
end

model/recipient.rb

belongs_to :message
belongs_to :user

model/user.rb

has_many :messages, :foreign_key => :sender_id

这是我的消息控制器

messages_controller.rb

def new
    @message = Message.new
    @user = current_user.following
    @users = User.all
    # @friends = User.pluck(:name, :id).sort
end

def create
    @message = current_user.messages.build(message_params)

    if @message.save
        flash[:success] = "Message Sent!"
        redirect_to messages_path
    else
        flash[:notice] = "Oops!"
        render 'new'
    end
end

def index
    @user = User.find(current_user)
    @messages = Recipient.where(:user_id => @user).order("created_at DESC")

end

private

    def message_params
        params.require(:message).permit(:body, :sender_id, user_tokens: [])
    end

我的观点

_form.html.erb

  </div>
  <!-- displays the current users frinds their following -->
  <%= f.select :user_tokens, @user.collect {|x| [x.name, x.id]}, {}, :multiple => true, class: "form-control" %>
  <br>

  <div class="modal-footer">
    <%= f.button :submit, class: "btn btn-primary" %>
  </div>

架构

messages_table

t.text     "body"
t.integer  "sender_id"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.string   "body_html"

recipients_table

t.integer  "message_id"
t.integer  "user_id"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false

希望对您有所帮助。