アソシエーションを利用して「登録した情報に紐づくユーザーのニックネーム」を取得しようとしています。
そこで下記の問題があります。
- アソシエーションを定義した上で、モデルのインスタンス.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で指定したリンクへ飛べた。
情報が足りない場合はご指摘願います。
どうか、ご教授のほど、よろしくお願いいたします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/06/26 11:45