2016-07-07 12 views
-2

Ich habe ein Benutzer-, Gesprächs- und Nachrichtenmodell. Ein Benutzer hat viele Unterhaltungen und Nachrichten. Eine Konversation hat viele Nachrichten und Nachrichten gehören sowohl zu Benutzern als auch zu Konversationen. Sowohl das Konversations- als auch das Nachrichtenmodell haben eine user_id-Spalte.undefined Methode `Name 'für Nil: NilClass - Modell Assoziation Probleme

Wenn ich versuche, den Namen des Benutzers anzuzeigen, der einer bestimmten Nachricht zugeordnet ist, erhalte ich den undefinierten Methodenfehler.

Mein Conversations_controller

class ConversationsController < ApplicationController 
    def create 
    @conversation = current_user.conversations.build(conversation_params) 
    if @conversation.save 
     save_conversation(@conversation) 
     flash[:notice] = "Conversation was succesfully created" 
     redirect_to conversation_path(@conversation) 
    else 
     render 'new' 
    end 
    end 

    def show 
    @conversation = Conversation.find(params[:id]) 
    save_conversation(@conversation) 
    @message = @conversation.messages.build 
    end 

Meine Nachrichten Controller

class MessagesController < ApplicationController 

    def create 
    @message = current_conversation.messages.build(message_params) 
    if @message.save 
     flash[:notice] = "Message was successfully created" 
     redirect_to conversation_path(current_conversation) 
    else 
     flash[:notice] = "Message not saved" 
     render 'new' 
    end 
    end 

    private 

    def message_params 
     params.require(:message).permit(:chat, :user_id) 
    end 

end 

Meine Modelle

class User < ApplicationRecord 
    has_many :conversations 
    has_many :messages 
end 
class Message < ApplicationRecord 
    belongs_to :conversation 
    belongs_to :user 
end 
class Conversation < ApplicationRecord 
    belongs_to :user 
    has_many :messages, dependent: :destroy 
end 

Und mein Gespräch zeigen Ansicht

<h1><%= @conversation.title %></h1> 

<p> 
    Description: <%= @conversation.description %> 
</p> 
<p> 
    Created by: <%= @conversation.user.name %> 
</p> 

<% if @conversation.messages.any? %> 
    <% @conversation.messages.each do |message| %> 
     <%= message.chat %> 
     <%= message.user.name %> 

    <% end %> 
    <% end %> 

Es ist der message.user.name, von dem Rails eine Ausnahme zu machen scheint. Ich hatte den Eindruck, dass, weil die beiden Modelle verbunden sind, ich user.name verwenden könnte?

Ich würde sehr jede Hilfe schätzen, die jemand anbieten kann, lassen Sie mich bitte wissen, wenn Sie noch etwas brauchen, um zu helfen.

Dank

+0

könnten Sie bitte den spezifischen Fehler, den Sie erhalten (die gesamte Fehlermeldung) posten. Ich würde helfen, das Problem zu diagnostizieren. – Sean

+0

@Sean die gesamte Fehlermeldung ist NoMethodError in Conversations # Show, undefinierte Methode 'Name 'für Nil: NilClass –

+0

von dieser Fehlermeldung können wir daraus schließen, dass das Problem nicht Name auf Benutzer anruft, das Problem ist, dass Sie versuchen zu Rufname auf Null. Dies bedeutet, dass message.user null zurückgibt. Versuchen Sie, den Grund zu finden, warum die Nachricht nicht mit dem Benutzer verknüpft ist, und dann denke ich, dass Ihr Code funktionieren sollte (sobald diese Verknüpfung festgelegt wurde) – Sean

Antwort

0

das möglich sein kann, weil:

Sie sind nicht die Anwesenheit eines Benutzers auf dem Nachrichtenmodell Validierung

Sie können nicht den Wert der user_id in Ihrem messages_controller werden zuweisen , ein Ansatz, dem ich wahrscheinlich folgen würde:

class MessagesController < ApplicationController 
    def create 
    @message = current_conversation.messages.build(message_params) 
    @message.user = current_user # provided you have current_user set somewher 
    if @message.save 
     flash[:notice] = "Message was successfully created" 
     redirect_to conversation_path(current_conversation) 
    else 
     flash[:notice] = "Message not saved" 
     render 'new' 
    end 
    end 
    ... 
end 
Verwandte Themen