2017-01-21 5 views
2

Je suis nouveau au développement, et j'ai passé les 12 dernières heures (littéralement) à essayer de comprendre ce message d'erreur - J'abandonne pour la nuit, mais pas avant un petit cri pour aider à stackoverflow.traverser les frontières des tables: rôle de la langue

Je cette forme:

<h2>Select from the language options below (or, <%= button_to "Login", 'users/login', method: :get %></h2> 

<%= form_for @language_role do |f| %> 

    <div id="input"> 
     <h3>I want to learn:</h3><%= select_tag(:language_id, options_from_collection_for_select(Language.all, :id, :lang_name)) %> 
    </div> 

    <div> 
     <p><%= f.submit "Start learning" %></p> 
    </div> 
<% end %> 

qui me donne ce message d'erreur, mettant en lumière la ligne @language_role = current_user.language_roles.build: "méthode non définie language_roles' pour nulle: NilClass"

J'ai trois tables:

create_table "language_roles", force: :cascade do |t| 
    t.integer "language_id" 
    t.boolean "is_active" 
    t.boolean "is_teacher" 
    t.datetime "created_at", null: false 
    t.datetime "updated_at", null: false 
    t.integer "user_id" 
    t.index ["user_id"], name: "index_language_roles_on_user_id" 
    end 

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

    create_table "users", force: :cascade do |t| 
    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.string "current_sign_in_ip" 
    t.string "last_sign_in_ip" 
    t.datetime "created_at",       null: false 
    t.datetime "updated_at",       null: false 
    t.index ["email"], name: "index_users_on_email", unique: true 
    t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true 
    end 

La table language_roles permet à un utilisateur d'avoir plusieurs langues, ainsi que de nombreux rôles dans cette langue. Voici mes définitions de classe:

class LanguageRole < ApplicationRecord 
    belongs_to :languages 
    belongs_to :users 
end 

class Language < ApplicationRecord 
    has_many :language_roles 
    has_many :users, :through => :language_roles 
end 

class User < ApplicationRecord 
    has_many :language_roles 
    has_many :languages, :through => :language_roles 
    # Include default devise modules. Others available are: 
    # :confirmable, :lockable, :timeoutable and :omniauthable 
    devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :validatable 
end 

Mon chemin racine va à « l'indice de la maison # », où l'utilisateur est censé choisir une langue si current_user.language_roles est vide. En tant que tel, je mets ce code dans mon contrôleur à domicile et language_roles contrôleur:

class HomeController < ApplicationController 
     def index 
     @language_role = current_user.language_roles.build 
     end 
    end 

class LanguageRolesController < ApplicationController 

    def create 
    @language_role = current_user.language_roles.build(language_role_params) 
    if @language_role.save 
     redirect_to root_path 
    else 
     redirect_to :back 
    end 
    end 

    private 

    def language_role_params 
    params.permit(:language_id) 
    end 
end 

Ce qui dans l'enfer est le problème ?? Je suppose que j'ai besoin d'instancier la variable en quelque sorte, mais je ne sais pas comment.

Merci, Michael

+1

est l'utilisateur connecté à ce moment-là? Je devine que vous ne pouvez pas obtenir des informations de l'utilisateur actuel, comme id (current_user.id) ou quelque chose comme ça? Comment l'utilisateur actuel est-il défini? Il ne semble pas que quelque chose fournisse ces données à la vue. "for nil: NilClass" signifie que current_user est vide, donc je commencerais par là. –

+0

Ahhhh super appel ... Je vais vérifier cela maintenant. – michaelsking1993

Répondre

1

Il y a une faute de frappe dans votre LanguageRole Modèle:

LanguageRole < ApplicationRecord 
    belongs_to :languages 
    belongs_to :users 
end 

devrait être

LanguageRole < ApplicationRecord 
    belongs_to :language 
    belongs_to :user 
end 

belongs_to Les associations doivent utiliser le terme singulier. Le nom de l'autre modèle est pluralisé lors de la déclaration d'une association has_many.

Ref: http://guides.rubyonrails.org/association_basics.html

+0

ahh, merci - J'ai corrigé, mais je reçois toujours la même erreur sur la méthode "language_roles": "NoMethodError dans HomeController # index méthode undefined' language_roles 'pour nil: NilClass " – michaelsking1993

+0

Aller d'abord et créer un utilisateur. http: // localhost: 3000/users/sign_up. Lorsque vous créez un utilisateur, ajoutez de la logique dans les vues d'index de votre maison. Quelque chose comme: '<% si utilisateur_utilisateur%> <% = form_for @language_role do | f | %> ...... <% else %> <% = link_to 'Connexion', new_user_session_path%> <% = link_to "Register", new_user_registration_path%> <% end %> ' Dans votre contrôleur à domicile ajouter ceci:' before_action: authenticate_user! ' – Blackcoat77

+0

Vous m'avez aidé à faire changer le message d'erreur, alors c'est bien! Maintenant, le message d'erreur met en évidence '<% = form_for @language_role do | f | %> ', en disant" méthode non définie 'language_roles_path 'pour # <# : 0x007fce03c9c0b0>". Je recevais ce message d'erreur plus tôt aujourd'hui au cours de cette session de débogage marathon - je n'ai jamais explicitement défini les routes "path", donc je ne suis pas sûr d'où cela vient. – michaelsking1993

0

Votre current_user n'est pas le définit paraît. Vous pouvez installer une gemme appelée 'pry-rails' et déboguer votre sortie de cette situation et toute autre à l'avenir. Voici un tutoriel comment l'utiliser Railscasts #280

0

Dans votre modèle LanguageRole vous avez défini comme belongs_to :users. Mais il devrait être belongs_to :user.

Votre look modèle comme ...

LanguageRole < ApplicationRecord 
    belongs_to :languages 
    belongs_to :users 
end 

Ce qui devrait être quelque chose comme

LanguageRole < ApplicationRecord 
    belongs_to :language 
    belongs_to :user 
end 
+0

Merci - juste réparé, mais je reçois toujours la même erreur: "NoMethodError dans HomeController # index méthode non définie' language_roles 'pour nil: NilClass " – michaelsking1993

+1

Votre méthode' current_user' obtient la valeur "nil" ... que signifie que votre méthode 'current_user' n'obtient pas l'utilisateur actuel. S'il vous plaît assurez-vous que vous avez ouvert une session. –