Рельсы принадлежат к проблеме во взглядах - PullRequest
1 голос
/ 12 июня 2010

У меня проблемы с ассоциацией в рельсах:

В настоящее время у меня есть модели Post и User, и отношения установлены следующим образом:

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

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

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

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

Ответы [ 2 ]

2 голосов
/ 12 июня 2010

Прежде всего проверьте, есть ли в таблице posts столбец с именем user_id (вы можете посмотреть эту таблицу в db / 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

1 голос
/ 12 июня 2010

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

Для этого обновите свой метод create, чтобы он был примерно таким::

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 для получения дополнительной информации о том, что вы можете делать с ассоциациями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...