質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Active Record

Active Recordは、一つのオブジェクトに対しドメインのロジックとストレージの抽象性を結合するデザインパターンです。

Q&A

解決済

2回答

2534閲覧

rails の参照元テーブル(post)から参照先テーブル(user)にアクセスする方法

mmm

総合スコア22

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Active Record

Active Recordは、一つのオブジェクトに対しドメインのロジックとストレージの抽象性を結合するデザインパターンです。

0グッド

0クリップ

投稿2014/09/28 08:10

パーフェクトRuby on Railsを見ながら勉強しているのですが、

postのViewにuserテーブルから
・nickname(TwitterAPIより取得)
・image_url(TwitterAPIより取得)
を表示させようとしています。

しかし、
undefined method `nickname' for nil:NilClass

というエラーがでてしまいます。

どこが問題になっているのでしょうか?

/posts/show.html.erb

lang

1<div class="page-header"> 2 <h1> 3 <%= @post.owner_name %>の投稿 4 </h1> 5</div> 6 7 <div class="panel panel-default"> 8 <div class="panel-heading"> 9 投稿者 10 </div> 11 <div class="panel-body"> 12 <%= link_to("https://twitter.com/#{@post.owner.nickname}") do %> 13 <%= image_tag '@post.owner.image_url' %> 14 <%= "@#{@post.owner.nickname}" %> 15 <% end %> 16 </div> 17 </div> 18 19 <div class="panel panel-default"> 20 <div class="panel-heading"> 21 コメント 22 </div> 23 <div class="panel-body"> 24 <%= @post.comment %> 25 </div> 26 </div>

/models/post.rb

lang

1class Post < ActiveRecord::Base 2 belongs_to :owner, class_name: 'User' 3 validates :comment, length: { maximum: 140 }, presence: true 4 validates :owner_name, presence: true 5 6end

/models/user.rb

lang

1class User < ActiveRecord::Base 2 3has_many :created_posts, class_name: 'Post', foreign_key: :owner_id, dependent: :nullify 4 5def self.find_or_create_from_auth_hash(auth_hash) 6 provider = auth_hash[:provider] 7 uid = auth_hash[:uid] 8 nickname = auth_hash[:info][:nickname] 9 image_url = auth_hash[:info][:image] 10 11 User.find_or_create_by(provider: provider, uid: uid) do |user| 12 user.nickname = nickname 13 user.image_url = image_url 14 end 15 end 16 17end

/migrate/post

lang

1class CreatePosts < ActiveRecord::Migration 2 def change 3 create_table :posts do |t| 4 t.integer :owner_id 5 t.string :owner_name 6 t.string :image, null: false 7 t.string :comment, null: false 8 9 t.timestamps 10 end 11 12 add_index :posts, :owner_id 13 end 14end 15

/migrate/user

lang

1class CreateUsers < ActiveRecord::Migration 2 def change 3 create_table :users do |t| 4 t.string :provider, null: false 5 t.string :uid, null: false 6 t.string :nickname, null: false 7 t.string :image_url, null: false 8 9 t.timestamps 10 end 11 12 add_index :users,[:provider, :uid], unique: true 13 end 14end 15

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ありがとうございます!
たしかにcountrolerの問題でした!

ずっと悩んでいたところが解決しました。

投稿2014/10/01 15:02

mmm

総合スコア22

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

エラーメッセージからは
@post.owner.nickname の部分が @post.owner == nil の状態で呼ばれてしまっていると想像できます。

controller で @post を設定している部分を確認してみるとよいと思います。

pry という gem を導入すれば、 ruby のコード部や erb 部に binding.pry という行を置くと、実行を ブレークさせ、そこで変数に値を参照・代入したり、そこからステップ実行できたりします。
(pry の使い方は別途 web 上の情報を参照して習得してください)

投稿2014/09/28 15:37

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問