2016-05-06 13 views
0

Ich versuche kumulative show.html für jeden Benutzer, der einige Daten von 4 verschiedenen Modellen anzeigt. Diese Tabellen:Undefinierte Methode, falsche Zuordnung oder Aufruf?

fragment of database model image

Problem ist, dass ich weiß nicht, wie für jede Schaltfläche, um Daten von Webseiten Tabelle nennen. Mit der Anzeige der Daten der Buttons gibt es kein Problem. Dieser Teil von HTML sollte in etwa so aussieht:

<% if @profile.buttons.any? %> 
    <ul> 
    <% @buttons.each do |button| %> 
    <li> 
    <%= button.website.name %> 
    <%= link_to button.user_website_url, button.user_website_url %> 
    </li> 
    <% end %> 
    </ul> 
<% else %> 
    <p>None websites added. Please finish your profile creation.</p> 
<% end %> 

Modelle:

class Website < ActiveRecord::Base 
has_many :buttons 
mount_uploader :logo, LogoUploader 
validates :name, presence: true, length: { maximum: 50 } 
validates :logo, presence: true 
end 

class Button < ActiveRecord::Base 
    belongs_to :profile 
    belongs_to :website 
    accepts_nested_attributes_for :website 
    validates :description, length: { maximum: 140 } 
    validates :user_website_url, presence: true, length: { maximum: 200 } 
end 

class Profile < ActiveRecord::Base 
    belongs_to :user 
    has_many :buttons, :dependent => :destroy 
    #... 
end 

Benutzer Controller:

def show 
    @user = User.find(params[:id]) 
    @profile = @user.profile 
    @buttons = @profile.buttons 
end 

In diesem Zustand von allem, was ich einen Fehler bin immer:

undefined method `name' for nil:NilClass

Also, was ist falsch daran? Ich habe viele Varianten von Assoziationen ausprobiert und ich bekomme entweder den Fehler, den ich oben gesetzt habe oder dass keine ID (falsche Abfrage) für jede Webseite passiert (mit der ich auch nicht umgehen konnte).

Antwort

0

Dies ist wahrscheinlich auf eine Schaltfläche, die keine zugehörige Website hat. Siehe die Zeile:

<%= button.website.name %> 

Wenn eine der Tasten ein website_id von nil hat, wäre das Ergebnis die Methode name auf dem Nullwert Aufruf der Fehler, den Sie sehen.

+0

danke, das war es. kingguy's .try (Anwendung erlaubte mir zu überprüfen, dass irgendwo in meiner Knopftabelle ein alter Datensatz ohne website_id war. Interessanterweise war es kein Datensatz für die Schaltfläche, die für den überprüften Benutzer angezeigt wurde. –

0

Irgend etwas stimmt nicht mit dem folgenden Code, button.website gibt nil zurück, und nil dosen't haben eine Methode name:

<%= button.website.name %> 

es zu beheben, versuchen Sie einfach verwenden:

<%= button.try(:website).try(:name) %> 
0

Diese Linie Erhöhung des Fehlers <%= button.website.name %>

.name erhält keinen Wert, weil Button keine zugehörige Website hat und deshalb gibt es nil:NilClass als einen Fehler zurück.

Verwandte Themen