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
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à. –
Ahhhh super appel ... Je vais vérifier cela maintenant. – michaelsking1993