2015-01-19 2 views
0

Ive пыталась создать систему обмена сообщениями для моего сайта, которая использует устройство для аутентификации. Необходимая функциональность должна состоять в том, чтобы отправлять сообщение одному или нескольким получателям (предпочтительно с формой контрольного списка с указанием пользователей). После некоторого времени поиска я нашел пару драгоценных камней, таких как почтовый ящик, но мне не нужны все его функции и я хотел создать свою собственную систему для обучения (все еще новичок в рельсах).Создание системы обмена сообщениями с нуля с несколькими получателями в рельсах 4

Я следовал этому древнему учебнику (http://web.archive.org/web/20100823114059/http://www.novawave.net/public/rails_messaging_tutorial.html). Я понимаю, что это очень старый учебник, но это единственный, который я смог найти, который соответствовал тому, чего я пытался достичь.

Я следил за учебником до Т и даже копировал и вставлял код из учебника после того, как мой код не работал.

при попытке доступа http://localhost:3000/mailbox я получаю NoMethodError в MailboxController # индекс

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 

модели/folder.rb

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

Любая помощь с этим было бы удивительным, а также просто дайте мне знать, если вам нужно больше информации и разместить его.

+1

'@ folder' - это нуль. Об этом сообщает сообщение об ошибке. Всегда ли это определено правильно. Вы уверены, что 'current_user.inbox' что-то возвращает? – ptd

+0

Я думаю, что это 'current_user.folders.find_by (params [: id])', который возвращает 'nil' в соответствии с сообщением об ошибке. Я предлагаю перейти на '@folder || = current_user.folders.find_by! (: Id => params [: id])', чтобы сделать поиск по id явным, и для него повысить полезную ошибку (по крайней мере, прямо сейчас) когда ничего не найдено –

+0

Спасибо за быстрый ответ, когда я заменяю current_user.folders.find_by (params [: id] с @folder || = current_user.folders.find_by! (: id => params [: id]), если get сообщение об ошибке «Не удалось найти папку с папками [WHERE]». user_id «=? AND« folders ».« id «IS NULL] –

ответ

1

В итоге я выяснил систему обмена сообщениями с несколькими изменениями. Я хотел опубликовать все мое решение, так как это дало мне трудное время и могло быть полезным для других. Я сохранил это очень просто и не включил модель папки, которая в первую очередь давала мне проблему, но тем не менее она функционирует.

Heres мои ассоциации

модель/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 

модель/recipient.rb

belongs_to :message 
belongs_to :user 

модель/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 

My Views

_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 

Надеюсь, это поможет.

Смежные вопросы