2014-04-16 40 views
0

我在我的Rails應用程序中設置了一個內部消息傳遞系統,並且無法將消息發送給其他用戶。Rails未定義的方法'each'for nil:NilClass

class User < ActiveRecord::Base 
    # messages and conversations 
    has_many :user_conversations 
    has_many :conversations, through: :user_conversations 
    has_many :messages 

class UserConversation < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :conversation 
    before_create :create_user_conversations 

    accepts_nested_attributes_for :conversation 

    delegate :subject, to: :conversation 
    delegate :users, to: :conversation 

    attr_accessor :to 

    private 
    def create_user_conversations 
     to.each do |recip| 
     recipient = User.find(recip) 
     UserConversation.create(user_id: recip, conversation_id: 1) 
     end 
    end 
end 

class Conversation < ActiveRecord::Base 
    has_many :user_conversations 
    has_many :users, through: :user_conversations 
    has_many :messages 
    accepts_nested_attributes_for :messages 

class Message < ActiveRecord::Base 
    belongs_to :user_conversation 
    belongs_to :user 

這裏是我的user_conversation_controller:

class UserConversationsController < ApplicationController 

    def new 
    @user = User.find(params[:user_id]) 
    @conversation = @user.user_conversations.build 
    @conversation.build_conversation.messages.build 
    end 

    def create 
    @conversation = UserConversation.new(conversation_params) 
    @conversation.user = current_user 
    @conversation.conversation.messages.first.user = current_user 
    if @conversation.save 
     redirect_to user_conversation_path(current_user, @conversation) 
    else 
     flash[:error] = "There was an error" 
     render 'new' 
    end 
    end 

    private 
    def conversation_params 
     params.require(:user_conversation).permit(:to => [], 
               conversation_attributes: [:subject, 
               messages_attributes: [:body]]) 
    end 

的錯誤出現在UserConversation模型create_user_conversations方法。當我嘗試運行時

to.each do |recip| 

我得到一個「未定義的方法」,每個'nil:NilClass'錯誤。然而,「到」陣列中有一個值,在這種情況下,參數是這樣的:

{"utf8"=>"✓", 
"user_conversation"=>{"to"=>["2"], 
"conversation_attributes"=>{"subject"=>"Hey", 
"messages_attributes"=>{"0"=>{"body"=>"hey"}}}}, 
"commit"=>"Create User conversation", 
"user_id"=>"1"} 

爲什麼數組是沒有得到正確地傳遞任何想法?謝謝。

回答

0

您定義toattr_accessor,這將創建一個實例變量@to get/set方法。不過,您在私有方法create_user_conversations中使用to作爲局部變量。這解釋了nil:NilClass錯誤。

嘗試將局部變量改爲實例變量。

+0

它給了我同樣的錯誤。 – bigLund8

+0

你可以發佈你正在使用'create_user_conversations'方法嗎? – Zajn

+0

我只在我的UserConversation Model類中使用create_user_conversations方法(如上所示)。我在使用before_create創建UserConversation之前調用它。 – bigLund8

0

我解決我的問題,通過走在前面,並添加recipients_id列到我的user_conversations表,然後在我的UserConversations控制器我能夠做

def create 
    @conversation = UserConversation.new(user_conversation_params) 
    @conversation.user = current_user 
    @conversation.conversation.messages.first.user_id = current_user.id 
    if @conversation.save 
    UserConversation.recipient_id = @conversation.recipient_id 
    redirect_to user_conversation_path(current_user, @conversation) 
    create_user_conversations 
    else 
    flash[:error] = "There was an error" 
    render 'new' 
    end 
end 

與私營方法create_user_conversations也是我UserConversations控制器:

def create_user_conversations 
    UserConversation.recipient_id.each do |recip| 
    recipient = User.find(recip) 
    UserConversation.create(user: recipient, conversation: @conversation.conversation) 
    end 
end 

我懷疑這是做這件事最優雅的方式,但至少可以完成這項工作。

相關問題