質問: Blog.includes(:blogcategory).order(created_at: :desc) # 投稿日の最新順に表示 end ``` ### view/blogs/index.html.erb viewが一番の問題で `<%= blog.category %>` だと空白のまま表示され、 `<%= blog.blogcategory.category %>` だと、 ``` NoMethodError in Blogs#index Showing /app/views/blogs/index.html.erb where line #34 raised: undefined method `category' for nil:NilClass ``` とエラーが出てしまいます。 しかし、Ajaxでカテゴリー名で絞り込み検索をすると、表示されます。 ajaxには `<%= blog.blogcategory.category %>` と記述していてこれで難なく表示されます。 ``` ブログタイトル カテゴリー 投稿日時 <% @blogs.each do |blog| %> <%= link_to blog_path(blog) do %> <%# タイトル名をクリックすると編集ページにリンクする %> <%= blog.blogtitle %> <% end %> <%= blog.blogcategory.category %> <%= blog.created_at %> <% end %> ``` ### models/blogs.rb ``` class Blog < ApplicationRecord belongs_to :blogcategory, optional: true end ``` ### models/blogcategory.rb ``` class Blogcategory < ApplicationRecord has_many :blogs accepts_nested_attributes_for :blogs, allow_destroy: true # 投稿フォームで必要。2つのフォームでDBに登録可能にする end ``` どのようにしたら各記事のカテゴリー名が表示されるでしょうか?ご指摘いただければと思います。
回答: とりあえず おそらくですが、DBに保存されたblogデータの中にblogcategory_idが空のもの、もしくは正しいblogcategory_idを持たないものが入っている気がします。 とりあえずでいうと、 `<%= blog.blogcategory.category %>`の部分を `<%= blog.blogcategory.try :category %>`に変更すれば動くかと思います。 そもそもの問題点 ``` class Blog < ApplicationRecord belongs_to :blogcategory, optional: true end ``` `optional: true`とあるように、blogデータはblogcategoryを必ず持つわけではありません。 blogcategory_idが未入力であったり、間違ったidが入っていてもいい定義になっている状態です。 にもかかわらず、`<%= blog.blogcategory.category %>`の部分で、blogcategoryが存在する前提でcategoryを呼んでいます。 blogがblogcategoryを持っていなかった(nil)場合に、nilにcategoryなんてメソッドねえよって怒られてるわけです。 カテゴリー名で絞るとエラーが消えるのは、blogcategoryが存在するblogデータだけが選ばれているからだと思います。 改善策としては * optional: trueを消して、blogがblogcategoryを確実に持つ状態にする * blogcategoryがない場合も考慮したviewの書き方をする(tryを使ったり、ifで分岐したり) のどちらかになるかと思います。 予想外れならすみません! 解決しなければ言ってください。頑張って!