2017-09-10 3 views
0

Je construis une application assez basique dans Rails, en utilisant deux contrôleurs principaux, utilisateurs et commentaires. J'utilise Bcrypt et a secure_password pour le cryptage de l'utilisateur, et les ressources imbriquées de sorte que l'utilisateur a beaucoup de commentaires et de commentaires appartenant à l'utilisateur.User_id n'est pas transmis au contrôleur secondaire

Lorsque j'essaie d'enregistrer un nouveau commentaire, le message d'erreur que je reçois est le suivant: Attribut inconnu 'user_id' pour Comment. Il semble que le user_id ne sont pas transmises au contrôleur, bien que cela devrait être fait en utilisant current_user tel que défini dans les contrôleurs de commentaires - qui ressemblent actuellement comme ceci:

def new 
    @user = current_user 
    @comment = Comment.new 
    @comment.save 
end 

def create 
    @user = current_user 
    @comment = @user.comments.new(comment_params) 
    @comment.save 
    redirect_to user_comments_path, notice: "Thank you for your comment!" 
end 

......

private 
def comment_params 
    params.require(:comment).permit(:user_id, :location, :title, :body) 
end 

Lorsque j'essaie d'enregistrer les commentaires auxquels je suis connecté, je ne sais pas pourquoi l'id_utilisateur ne serait pas transmis au contrôleur. J'apprécierais beaucoup un conseil, merci.

Répondre

0

Lorsque je tente d'enregistrer un nouveau commentaire, le message d'erreur que je reçois est le suivant:. « Attribut inconnu « user_id » pour Commentaire

Lorsque vous utilisez l'association d'association belongs_to vous devez réellement ajouter la colonne à la table pour stocker la clé étrangère

Vous pouvez générer avec la migration.

rails g migration add_user_id_to_comments user:belongs_to 

Puis migrer avec rails db:migrate.

Votre contrôleur a de nombreux problèmes ainsi:

def new 
    @comment = current_user.comments.new 
    # never save in new method! 
end 

def create 
    @comment = current_user.comments.new(comment_params) 
    # you always have to check if save/update was successful 
    if comment.save 
    redirect_to user_comments_path, notice: "Thank you for your comment!" 
    else 
    render :new 
    end 
end 

Il n'y a pas besoin de sauver current_user à une variable d'instance distincte que vous devriez memoizing il.

def current_user 
    @current_user ||= session[:user_id] ? User.find(session[:user_id]) : nil 
end