2016-06-28 12 views
0

Bitte beachten Sie, dass "Anwendungen" eine schlechte Namenskonvention war. Dies ist, weil es ein Stipendienanwendungsportal ist.Rails: NoMethodError in Anwendungen # Index

Ich bekomme den folgenden Fehler, wenn ich versuche, den Index für Anwendungen zu öffnen.

NoMethodError in Applications#index 

Showing /home/zane/scholarship-application/app/views/applications/_current_user_application.html.erb where line #22 raised: 

undefined method `name' for nil:NilClass 

Extracted source (around line #22): 

20 
21 
22 
23 
24 
25 




    <tbody> 
     <tr> 
     <td><%= current_user.application.name %></td> 
     <td><%= current_user.application.name %></td> 
     <td><%= current_user.application.gender %></td> 
     <td><%= current_user.application.date_of_birth %></td> 

Hier ist, was der Code für die Seite wie folgt aussieht:

<% if user_signed_in? && current_user.role == "User" %> 

<h1 class="center">Your Application</h1> 

<table class="table"> 
    <thead> 
    <tr> 
     <th>Name</th> 
     <th>Gender</th> 
     <th>Date of birth</th> 
     <th>GPA</th> 
     <th>Address</th> 
     <th>State</th> 
     <th>University</th> 
     <th>Essay</th> 
     <th colspan="3"></th> 
    </tr> 
    </thead> 

    <tbody> 
     <tr> 
     <td><%= current_user.application.name %></td> 
     <td><%= current_user.application.gender %></td> 
     <td><%= current_user.application.date_of_birth %></td> 
     <td><%= current_user.application.gpa %></td> 
     <td><%= current_user.application.address %></td> 
     <td><%= current_user.application.state %></td> 
     <td><%= current_user.application.university %></td> 
     <td><%= current_user.application.essay %></td> 
     <td><%= link_to 'Show', current_user.application %></td> 
     <td><%= link_to 'Edit', current_user.edit_application_path(application) %></td> 
     <td><%= link_to 'Destroy', current_user.application, method: :delete, data: { confirm: 'Are you sure?' } %></td> 
     </tr> 
    </tbody> 
</table> 

<% end %> 

Benutzermodell:

class User < ActiveRecord::Base 
    #Defining different roles 
    enum role: [:Guest, :User, :Admin] 
    #Users can only have one scholarship application 
    has_one :applications 
    # Include default devise modules. Others available are: 
    # :confirmable, :lockable, :timeoutable and :omniauthable 
    devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :validatable 
end 

Ability Modell:

class Ability 
    include CanCan::Ability 

    def initialize(user) 
    user ||= User.new # guest user (not logged in) 
     if user.role == "Admin" 
      can :manage, :all 
     elsif user.role == "User" 
      can :manage, Application 
      can :manage, User 
     else 
      can :read, Static_Page 
     end 
    end 
end 

Anwendungsmodell:

012.351.
class Application < ActiveRecord::Base 
    belongs_to :user 

    #Users may only submit one application 
    validate :limit_applications, :on => :create 

    #User must fully fill out all forms application 
    validates :name, presence: true 
    validates :gender, presence: true 
    validates :date_of_birth, presence: true 
    validates :gpa, presence: true 
    validates :university, presence: true 
    validates :address, presence: true 
    validates :state, presence: true 

    private 
    def limit_applications 
     limit = 1 
     if self.user.applications.(:reload).count >= limit 
      errors.add(:base, "You can only create #{limit} application.") 
      end 
     end 
end 

schema.rb

create_table "applications", force: :cascade do |t| 
    t.string "name" 
    t.string "gender" 
    t.date  "date_of_birth" 
    t.string "gpa" 
    t.text  "essay" 
    t.datetime "created_at", null: false 
    t.datetime "updated_at", null: false 
    t.string "university" 
    t.string "address" 
    t.string "state" 
    t.integer "user_id" 
    end 

    create_table "entries", force: :cascade do |t| 
    t.string "name" 
    t.boolean "winner" 
    t.datetime "created_at", null: false 
    t.datetime "updated_at", null: false 
    end 

    create_table "nasa_apis", force: :cascade do |t| 
    t.datetime "created_at", null: false 
    t.datetime "updated_at", null: false 
    end 

    create_table "users", force: :cascade do |t| 
    t.string "first_name" 
    t.string "last_name" 
    t.datetime "created_at",        null: false 
    t.datetime "updated_at",        null: false 
    t.string "email",     default: "", null: false 
    t.string "encrypted_password",  default: "", null: false 
    t.string "reset_password_token" 
    t.datetime "reset_password_sent_at" 
    t.datetime "remember_created_at" 
    t.integer "sign_in_count",   default: 0,  null: false 
    t.datetime "current_sign_in_at" 
    t.datetime "last_sign_in_at" 
    t.inet  "current_sign_in_ip" 
    t.inet  "last_sign_in_ip" 
    t.integer "role",     default: 1 
    t.boolean "winner",     default: false 
    t.integer "application_id" 
    end 
+0

Können Sie nach Ihrem 'User' Modell? – treiff

+0

Würde es Ihnen etwas ausmachen, Ihren user.rb - Code zu posten?. Offenbar haben Sie dort keine 'Anwendungsbeziehung' definiert oder es gibt keine Methode mit diesem Namen im Benutzermodell. – fanta

+0

Aktualisiert mit Modellen! –

Antwort

0

Ich werde annehmen, dass Sie ein Modell application.rb genannt gemacht. Wenn Sie current_user.application eingeben, sucht Rails nach einer Methode namens application. Dies funktioniert nur, wenn Sie in Ihrem Modell eine Datenbankzuordnung angegeben haben, um sie mit einer Tabelle namens Anwendungen zu verbinden. Ich weiß nicht, was die Assoziation ist, aber wenn Sie .application (singular) aufrufen, würde ich mir vorstellen, dass Sie eines von diesen zu Ihrem Benutzermodell hinzufügen müssen: has_one :application oder belongs_to :application. Beachten Sie, dass Sie dem Anwendungsmodell auch die entsprechende Datenbankzuordnung hinzufügen müssen. Es gibt auch eine Chance, dass Rails das Wort Anwendung nicht mag und das könnte nur alles vermasseln.

Auch die Attribute, die Sie benannt haben, klingen sehr ähnlich wie Attribute, die zu einem Benutzer gehören sollten, nicht zu einer Anwendung. Gibt es eine Chance, dass Sie die .application überhaupt nicht benötigen und das sind Attribute Ihres Benutzermodells? Das würde bedeuten, Code wie current_user.email zu schreiben, nicht current_user.application.email.

+0

Ich habe es gerade mit dem Code von diesen Modellen aktualisiert! Was ich meinte ist, dass ich die Anwendung current_user posten wollte und dann die E-Mail von dieser Anwendung (E-Mail ist ein Feld, das sie in der Anwendung eingeben) –

0

Nun, da Sie mehr Code die Antwort enthalten haben, ist ziemlich klar: Veränderung has_one :applications-has_one :application

+0

Ok, also tat ich das und es gab mir einen anderen Fehler –

+0

Welchen Fehler gab es Du? – Philip7899

+0

Dies ist die Antwort. Die Tatsache, dass Sie einen weiteren Fehler erhalten, bedeutet, dass dies korrekt war. Es scheint, dass Sie die Frage mit dem neuen Fehler aktualisiert haben, und von meinem Verständnis her ist die Antwort auf Ihr neues Problem: Sie bekommen den Fehler, weil einige Ihrer Benutzer keine Anwendung haben, also ruft current_user.application nil und Sie zurück kann nicht .name auf null – Philip7899

Verwandte Themen