2010-06-11 5 views
1

Im ayant des problèmes avec une association dans des rails:Rails belongs_to question dans les vues

Actuellement, j'ai modèles de poste et l'utilisateur, et la relation est définie ainsi:

class User < ActiveRecord::Base 
    attr_accessible :username, :name, :lastname 
    has_many :posts 
end 

class Post < ActiveRecord::Base 
    attr_accessible :title, :body 
    belongs_to :user 
end 

Cependant, dans mon application /views/posts/index.html.haml quand je suis essayant d'accéder au nom d'utilisateur pour le poste que je reçois cette erreur:

undefined method `name' for nil:NilClass 

Voici mon avis:

- title "Posts" 

%table 
    %tr 
    %th Title 
    %th Body 
    %th Author 
    - for post in @posts 
    %tr 
    %td= h post.title 
    %td= h post.body 
    %td= h post.user.name 
    %td= link_to 'Show', post 
    %td= link_to 'Edit', edit_post_path(post) 
    %td= link_to 'Destroy', post, :confirm => 'Are you sure?', :method => :delete 

%p= link_to "New Post", new_post_path 

Toute pensée de ce que Im faire le mal sera appretiated

+0

allez-vous me montrer le code dans la partie d'action. –

+1

Il semble qu'il y ait un (ou plusieurs) modèle 'Post' dans' @ posts' qui n'a pas de jeu d'utilisateur. –

+0

@piemersons le contrôleur? def afficher @post = Post.find (params [: id]) fin –

Répondre

2

tout d'abord vérifier si posts table a une colonne nommée user_id (vous pouvez rechercher cette table db/schema.rb)

Si non , vous avez probablement besoin de créer une migration:
$ ruby script/generate migration AddUserIdToPosts

class AddUserIdToPosts < ActiveRecord::Migration 
    def self.up 
    add_column :posts, :user_id, :integer 
    end 

    def self.down 
    remove_column :posts, :user_id 
    end 
end 

et puis appliquer des modifications à la base de données et schema.rb
$ rake db:migrate

+0

Salut Andrew, Je n'avais pas la colonne user_id alors j'ai ajouté , cependant je reçois toujours l'erreur suivante: méthode non définie name » pour nul: NilClass –

+0

Merci Andrew, je l'ai résolu de sauver l'utilisateur ainsi que le poste comme celui-ci: @post = Post.new (params [ : post]) @ post.user = User.find (2) si @ post.save flash [: notice] = "Post créé avec succès." redirect_to @post autre rendre: action => 'nouveau' fin Maintenant Im changer le User.find à l'utilisateur actuellement connecté, merci beaucoup! –

1

Sur la base de vos commentaires, il semble que vous n'êtes pas associez les Userdonnées réelles avec les Postdonnées. Vous avez les associations configurées, et après la réponse d'Andrew vous semblez maintenant avoir le schéma de base de données mis en place, mais vous ne sauvegardez pas les données n'importe où.

Pour ce faire, mettez à jour votre méthode de création pour être quelque chose comme ceci:

def PostsController < ActionController::Base 
    def create 
    # Assumes @user is already set to whatever user should be associated with the post 
    post = @user.posts.build(params[:post]) # Where params[:post] are the post inputs from your form 
    # ... 
    if post.save 
     flash[:notice] = "Successfully created post." 
     redirect_to post 
    else 
     render :action => 'new' 
    end 
    end 
end 

@user.posts.build dit Rails pour créer un nouveau poste (en mémoire) et l'associer au @user modèle utilisateur. Un équivalent (mais plus longue) façon d'exprimer ceci est:

post = Post.new(post[:params]) 
post.user = @user 

Voir la documentation ActiveRecord::Associations::ClassMethods pour plus d'informations sur ce que vous pouvez faire avec les associations.