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

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

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

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

2回答

1167閲覧

Rails 関連づけたモデルの情報を表示できない

goffee555

総合スコア6

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2020/06/25 14:32

編集2020/06/25 22:44

アソシエーションを利用して「登録した情報に紐づくユーザーのニックネーム」を取得しようとしています。
そこで下記の問題があります。

  • アソシエーションを定義した上で、モデルのインスタンス.nicknameと記述しても、エラーが出る。

NoMethodError in Companies#index

ruby

1ActionView::Template::Error (undefined local variable or method `user' for #<#<Class:0x00007fd4f16c6830>:0x00007fd4f16c4d28>): 2 22: </ul> 3 23: <span class="name"> 4 24: <a href="/users/<%= company.user_id %>"> 5 25: <span>投稿者</span><%= user.nickname %> 6 26: </a> 7 27: </span> 8 28: <% end %> 9 10app/views/companies/index.html.erb:25:in `block in _app_views_companies_index_html_erb___1615764612151399934_70276280104980' 11app/views/companies/index.html.erb:2:in `_app_views_companies_index_html_erb___1615764612151399934_70276280104980' 12

models/company.rb

ruby

1class Company < ApplicationRecord 2 belongs_to :user 3end

models/user.rb

ruby

1class User < ApplicationRecord 2 3 mount_uploader :image, ImageUploader 4 # has_one_attached :image 5 6 # Include default devise modules. Others available are: 7 # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable 8 devise :database_authenticatable, :registerable, 9 :recoverable, :rememberable, :validatable 10 11 has_many :companies 12 13end 14

controllers/companies_controller.rb

ruby

1class CompaniesController < ApplicationController 2 3 def index 4 @companies = Company.includes(:user).order("created_at DESC") 5 end 6 7 def new 8 end 9 10 require 'rubygems' 11 require 'mechanize' 12 13 def create 14 …中略 15 end 16 17 def edit 18 @company = Company.find(params[:id]) 19 end 20 21 def update 22 company = Company.find(params[:id]) 23 company.update(company_params) 24 end 25 26 def destroy 27 company = Company.find(params[:id]) 28 if company.user_id == current_user.id 29 company.destroy 30 else 31 flash[:notice] = "投稿者以外は削除できません。" 32 redirect_to action: :index 33 end 34 end 35 36 37 private 38 def wiki_url 39 params.permit(:wiki_url) 40 end 41 42 def company_params 43 params.permit(:page_url, :name, :logo_image, :head_image, :text, :text2, :text3, :link) 44 end 45end 46

companise/index.html.erb

ruby

1 <% @companies.each do |company| %> 2 <p><%= company.name %></p> 3 <img src=<%= company.logo_image %> > 4 <img src=<%= company.head_image %> > 5 <p><%= company.text %></p> 6 <p><%= company.text2 %></p> 7 <p><%= company.text3 %></p> 8 <p> 9 <a target="_blank"href=<%= company.link %> >公式サイトはこちら</a> 10 </p> 11 <ul> 12 <li> 13 <%= link_to 'EDIT', "/companies/#{company.id}/edit", method: :get%> 14 </li> 15 <li> 16 <%= link_to 'DELETE', "/companies/#{company.id}", method: :delete, data: 17 { confirm: '本当に削除して良いですか?', 18 cancel: 'やめる', 19  commit: '削除する'}, title: '削除確認' %> 20 </li> 21 </ul> 22 <span class="name"> 23 <a href="/users/<%= company.user_id %>"> 24 <span>投稿者</span><%= company.user.nickname %> 25 </a> 26 </span> 27 <% end %> 28

db schema

create_table "users", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| t.string "email", default: "", null: false t.string "nickname" t.string "image" t.text "message" t.string "encrypted_password", default: "", null: false t.string "reset_password_token" t.datetime "reset_password_sent_at" t.datetime "remember_created_at" t.datetime "created_at", null: false t.datetime "updated_at", null: false t.index ["email"], name: "index_users_on_email", unique: true t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true

試したこと

  • <%= company.user.nickname %>を<%= company.user %>に変更して試した場合、

投稿者#User:0x00007fホニャラララ…と表示され、hrefで指定したリンクへ飛べた。

情報が足りない場合はご指摘願います。
どうか、ご教授のほど、よろしくお願いいたします。


追記
DBの中身は以下の通りです
イメージ説明
イメージ説明

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

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

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

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

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

guest

回答2

0

ベストアンサー

model Company の情報がないので推測ですが、user が無くても登録出来るようになっていませんか?
undefined method nickname' for nil:NilClass): というのは、company.user.nicknamecompany.user がnilと言うことです。 つまり user_idがnilのcompanyがある。 「<%= company.user.nickname %>を<%= company.user %>に変更して試した場合、投稿者#<User:0x00007fホニャラララ…>と表示され、hrefで指定したリンクへ飛べた。」とあるのでごまかされましたが、それは全てのcompanyではなく、「投稿者#<User:0x00007fホニャラララ…>」とは表示されず、「投稿者」だけのcompanyが有るのでは?そのcompanyのところで上のエラーが起きています。 全てのcmpanyにuserがわり当たるようにするか、userのないcompanyもありえるのでしたらcompany.user.try(:nickname)`に。

投稿2020/06/25 23:27

winterboum

総合スコア23347

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

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

goffee555

2020/06/26 11:45

ご教授いただきありがとうございました。 無事に問題を解決できました。 問題の原因は、おっしゃられた「全てのcmpanyにuserがわり当たる…」がヒントになり companyに紐づかないuser_idが存在していたことが原因でした。 また、投稿者#<User:0x00007fホニャラララ…>と表示されたのは唯一 user_id と紐づいていたcompanyのみで、他のcompanyは「投稿者」のみの表示でした。 的確な問題解決に頭が上がりません。 大変恐れ入ります。
guest

0

エラーみると
company.user.nickname
ではなく
user.nickname
になってるのでソースの反映ミスとかじゃないんでしょうか

company.user.nickname
に戻してもう1度調べてみてください

投稿2020/06/25 16:14

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

goffee555

2020/06/25 21:58

ご回答いただきありがとうございます company.user.nicknameで実行したのですが、エラーが出てしまいます ActionView::Template::Error (undefined method `nickname' for nil:NilClass): 22: </ul> 23: <span class="name"> 24: <a href="/users/<%= company.user_id %>"> 25: <span>投稿者</span><%= company.user.nickname %> 26: </a> 27: </span> 28: <% end %> app/views/companies/index.html.erb:25:in `block in _app_views_companies_index_html_erb___1960046905947911243_26884180' app/views/companies/index.html.erb:2:in `_app_views_companies_index_html_erb___1960046905947911243_26884180'
退会済みユーザー

退会済みユーザー

2020/06/26 09:27

DB 見る限り company の user_id が全部1なのにユーザID1のユーザが存在しないですね 保存するときの関連付けがうまくいってないです strong parameter にユーザIDがないしupdateにもユーザセットしてる感じがしないので create の中が怪しいです
goffee555

2020/06/26 11:54

ご教授いただきありがとうございました。 createやupdateのユーザーセットに注目する手段は頭にありませんでした! 今後の問題解決の着眼点として参考になりました! また、機会があれば是非ご教授願います。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問