2010-06-11 4 views
1

Im возникли проблемы с объединением в рельсах:Rails BELONGS_TO вопрос во взглядах

В настоящее время у меня есть пост и пользовательские модели, а также взаимосвязь устанавливается таким образом:

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 

Однако в моем приложении /views/posts/index.html.haml когда Im пытается получить доступ к имени пользователя на пост, я получаю эту ошибку:

undefined method `name' for nil:NilClass 

Это мое мнение:

- 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 

Любые мысли, что я делаю неправильно будет appretiated

+0

будет показывать код в действии. –

+1

Похоже, что существует одна (или более) модель 'Post' в' @ posts', которая не имеет набора пользователей. –

+0

@piemersons контроллер? def show @post = Post.find (params [: id]) end –

ответ

2

Прежде всего, проверьте, если posts таблица содержит столбец с именем user_id (вы можете поиска таблицу в БД/schema.rb)

Если нет вы, вероятно, нужно создать миграцию:
$ 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 

а затем применить изменения в базу данных и schema.rb
$ rake db:migrate

+0

Hi Andrew, У меня не было столбца user_id, поэтому я добавил но, тем не менее, я все еще получаю следующую ошибку: undefined method 'name 'for nil: NilClass –

+0

Спасибо Andrew, я решил его сохранить пользователя вместе с сообщением вроде этого: @post = Post.new (params [ : post]) @ post.user = User.find (2) if @ post.save flash [: notice] = "Успешно созданный пост." redirect_to @post еще оказывают: действие => «новый» конец Теперь Im изменяя User.find для текущего вошедшего пользователя, спасибо большое! –

1

на основе ваших комментариев, это выглядит, как вы не связывая фактические Userданные с Postданных. У вас установлены ассоциации, и после ответа Андрея у вас, похоже, теперь есть схема базы данных, но вы не сохраняете данные нигде.

Чтобы сделать это, обновить свой метод создания, чтобы быть что-то вроде этого:

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 говорит Rails, чтобы создать новую запись (в памяти) и связать его с моделью @user пользователя. Эквивалент (но длительный) способ выразить это:

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

Смотрите документацию по ActiveRecord::Associations::ClassMethods для получения дополнительной информации о том, что вы можете сделать с ассоциациями.

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