2016-06-28 3 views
0

Обратите внимание, что «приложения» были плохим соглашением об именах. Это потому, что это портал приложений для стипендий.Rails: NoMethodError in Applications # index

При попытке открыть индекс для приложений появляется следующее сообщение об ошибке.

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> 

Вот что код этой страницы выглядит следующим образом:

<% 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 %> 

пользователя Модель:

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 

Способность Модель:

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 

Применение Модель:

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

Вы можете оставить 'модели User'? – treiff

+0

не могли бы вы опубликовать свой код user.rb?. Похоже, вы не определили отношения «приложение» или нет метода с этим именем в модели пользователя. – fanta

+0

Обновлено с помощью моделей! –

ответ

0

Я предполагаю, что вы сделали модель под названием application.rb. Когда вы вводите current_user.application, Rails ищет метод, называемый приложением. Это будет работать, только если вы указали ассоциацию базы данных в своей модели, чтобы подключить ее к таблице, называемой приложениями. Я не знаю, что такое ассоциация, но если вы вызываете .application (единственное число), я бы предположил, что вам нужно добавить одну из них в свою модель пользователя: has_one :application или belongs_to :application. Имейте в виду, что вам также необходимо добавить соответствующую ассоциацию базы данных в Application Model. Также есть шанс, что Rails не понравится слово Application, и это может просто испортить все.

Кроме того, атрибуты, которые вы назвали, звучат очень ужасно, как атрибуты, которые должны принадлежать пользователю, а не приложению. Есть ли вероятность, что вам вообще не нужен .application, и это атрибуты вашей модели пользователя? Это означало бы написание кода вроде current_user.email, а не current_user.application.email.

+0

Я только что обновил его с помощью кода с этих моделей! Я имел в виду, что я хотел опубликовать приложение current_user, а затем письмо от этого приложения (адрес электронной почты - это поле, которое они набирают в приложении). –

0

Теперь, когда вы включили больше коды ответ довольно ясен: изменение has_one :applications к has_one :application

+0

Итак, я сделал это, и это дало мне еще одну ошибку. –

+0

. Какую ошибку это дало ты? – Philip7899

+0

Это ответ. Тот факт, что вы получаете еще одну ошибку, означает, что это было точно. Кажется, вы обновили вопрос с новой ошибкой, и, насколько я понимаю, это ответ на вашу новую проблему: вы получаете ошибку, потому что у некоторых из ваших пользователей нет приложения, поэтому вызов current_user.application возвращает nil, а вы не может вызывать .name on nil – Philip7899

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