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

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

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

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

Ruby

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

Ruby on Rails

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

Ruby on Rails 4

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

Q&A

解決済

2回答

2496閲覧

Rails モデル同士で紐づけをしたのにメソッドがビューで使えません

k_yusuke

総合スコア19

Ruby on Rails 5

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

Ruby

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

Ruby on Rails

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

Ruby on Rails 4

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

0グッド

0クリップ

投稿2019/07/21 15:18

編集2019/07/22 13:28

発生している問題・エラーメッセージ

・MicropostモデルとUserモデルを紐づけたが、userメソッドが使えない
↓がエラーメッセージです。

NoMethodError in Microposts#index Showing /home/ubuntu/environment/rails_app/app/views/microposts/_micropost.html.erb where line #3 raised: undefined method `user' for #<Class:0x00007fab78d47418> Did you mean? super app/views/microposts/_micropost.html.erb:3:in `_app_views_microposts__micropost_html_erb__4579145426954223205_70304152209200' app/views/microposts/index.html.erb:2:in `block in _app_views_microposts_index_html_erb___1913828141426248439_70304152043480' app/views/microposts/index.html.erb:1:in `_app_views_microposts_index_html_erb___1913828141426248439_70304152043480'
ActionView::Template::Error (undefined method `user' for #<Class:0x0000565271879460> Did you mean? super): 1: <% micropost = Micropost %> 2: <li id="micropost-<%= micropost.ids %>"> 3: <%= link_to gravatar_for(micropost.user, size: 50), micropost.user %> 4: <span class="user"><%= link_to micropost.user.name, micropost.user %></span> 5: <span class="content"><%= micropost.content %></span> 6: <span class="timestamp"> app/views/microposts/_micropost.html.erb:3:in `_app_views_microposts__micropost_html_erb__4579145426954223205_70304152209200' app/views/microposts/index.html.erb:2:in `block in _app_views_microposts_index_html_erb___1913828141426248439_70304152043480' app/views/microposts/index.html.erb:1:in `_app_views_microposts_index_html_erb___1913828141426248439_70304152043480' Rendering /home/ubuntu/.rvm/gems/ruby-2.6.3/gems/actionpack-5.0.7.2/lib/action_dispatch/middleware/templates/rescues/template_error.html.erb within rescues/layout Rendering /home/ubuntu/.rvm/gems/ruby-2.6.3/gems/actionpack-5.0.7.2/lib/action_dispatch/middleware/templates/rescues/_source.html.erb Rendered /home/ubuntu/.rvm/gems/ruby-2.6.3/gems/actionpack-5.0.7.2/lib/action_dispatch/middleware/templates/rescues/_source.html.erb (3.8ms) Rendering /home/ubuntu/.rvm/gems/ruby-2.6.3/gems/actionpack-5.0.7.2/lib/action_dispatch/middleware/templates/rescues/_trace.html.erb Rendered /home/ubuntu/.rvm/gems/ruby-2.6.3/gems/actionpack-5.0.7.2/lib/action_dispatch/middleware/templates/rescues/_trace.html.erb (1.6ms) Rendering /home/ubuntu/.rvm/gems/ruby-2.6.3/gems/actionpack-5.0.7.2/lib/action_dispatch/middleware/templates/rescues/_request_and_response.html.erb Rendered /home/ubuntu/.rvm/gems/ruby-2.6.3/gems/actionpack-5.0.7.2/lib/action_dispatch/middleware/templates/rescues/_request_and_response.html.erb (0.6ms) Rendered /home/ubuntu/.rvm/gems/ruby-2.6.3/gems/actionpack-5.0.7.2/lib/action_dispatch/middleware/templates/rescues/template_error.html.erb within rescues/layout (17.7ms)

該当のソースコード

app/model/User.rb

ruby

1class User < ApplicationRecord 2 has_many :microposts, dependent: :destroy 3| 4| 5end

app/model/Micropost.rb

ruby

1class Micropost < ApplicationRecord 2belongs_to :user 3| 4| 5end
class MicropostsController < ApplicationController def index @microposts=Micropost.all end end

/app/view/microposts/index.html.erb

ruby

1<%@microposts.each do |post|%> 2 <%= render "microposts/micropost" %> 3<%end%> 4 <%= paginate @microposts %>

/app/view/microposts/_micropost.html.erb

ruby

1<% micropost = Micropost %> 2<li id="micropost-<%= micropost.id %>"> 3 <%= link_to gravatar_for(micropost.user, size: 50), micropost.user %> 4 <span class="user"><%= link_to micropost.user.name, micropost.user %></span> 5 <span class="content"><%= micropost.content %></span> 6 <span class="timestamp"> 7 <%= time_ago_in_words(micropost.created_at)%> 前 8 </span> 9</li>

試したこと

binding.pryを使ってコンソール内でいくつか検証してみました。
Micropost.first.user⇒ユーザー参照できました。
micropost.first.userも同様です。

補足情報(FW/ツールのバージョンなど)

cloud9使用
Rails 5.0.7.2

助けていただけるとありがたいです。お願いします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

erb

1<% micropost = Micropost %> 2... 3<%= link_to ..., micropost.user %>

このように書いてありますがMicropostのクラスメソッドとしてuserがあるのですか?

rb

1module MicropostsHelper 2 def user 3 return User.find_by(id: self.user_id) 4 end 5end

としてありますが、ここでのselfMicropostクラスでもクラスインスタンスでもないのは理解していますか?

多分これで動くかな?(未検証)

erb

1<ul> 2<%= render @microposts %> 3</ul> 4<%= paginate @microposts %>

erb

1<li id="micropost-<%= micropost.id %>"> 2 <%= link_to gravatar_for(micropost.user, size: 50), micropost.user %> 3 <span class="user"><%= link_to micropost.user.name, micropost.user %></span> 4 <span class="content"><%= micropost.content %></span> 5 <span class="timestamp"> 6 <%= time_ago_in_words(micropost.created_at)%>7 </span> 8</li>

投稿2019/07/22 01:58

編集2019/07/23 00:12
Mugheart

総合スコア2344

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

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

k_yusuke

2019/07/22 06:21

>このように書いてありますがMicropostのクラスメソッドとしてuserがあるのですか? すみません、理解不足でした。userメソッドはbelong_to user で定義されたMicropostのメソッドだったようです... >としてありますが、ここでのselfはMicropostクラスでもクラスインスタンスでもないのは理解していますか? 理解できていないと思います。 selfはメソッドのレシーバーに代入されるのかなという認識でした。 この場合のselfは何を指しているのでしょうか?もしかして空っぽだったりしますか?
Mugheart

2019/07/22 06:48

> この場合のselfは何を指しているのでしょうか? 実際に出力してみれば早い話ですが #<#<Class:0x0000...9c0>:0x0000...da0> こんな感じになっています。 あんまりModule単体でのselfを考えないのでようわかりませんが Module自体はクラスではないがサブクラスにClassクラスを持つので そこが呼ばれているのかな...と言う感じです。
k_yusuke

2019/07/22 13:18

回答ありがとうございます。selfが何を指すのか深く考えれていなかったように思います。 クラスやサブクラスについて理解が足りないので恥ずかしいです。ちゃんと勉強します。
Mugheart

2019/07/23 00:20

あとは <% micropost = Micropost %> としているので Micropostクラスインスタンスであるべきmicropost変数が Micropostクラスそのものになっています。 > userメソッドはbelong_to user で定義されたMicropostのメソッドだったようです... とおっしゃっているuserというメソッドはMicropostのインスタンスメソッドなので Micropostクラスインスタンスに対して使用する必要があります。 ちなみにMicropostクラスそのものに対して使われるメソッドはクラスメソッドです。 クラスインスタンスは例えば Micropost.new で生成されるオブジェクトです。 クラスそのものとは、そのままMicropostそのものです。 Micropost.new.method で使われるようなものがインスタンスメソッド Micropost.method で使われるようなものがクラスメソッドです。
k_yusuke

2019/07/23 04:46

なるほど!めちゃくちゃわかりやすいです! 今回の場合<% micropost = Micropost %>と書いてしまうと、micropost.userという記述のuserメソッドのレシーバーはMicropostクラスそのものになってしまうんですね...!
guest

0

そのエラーがどのファイルのどの行で起きたかという情報が有ったはずです、それが判るようにして頂けると、確実性が上がります。

まず確認ですが、
class Micropost に  belongs_to user が定義されていますね?
> Micropost.first.user⇒ユーザー参照できました。
> micropost.first.userも同様です。
ここのuserはその定義で作成された、Micopostのmethodです。
示されたviewのcodeはみなこのuserを指しているように読めるので、ここでエラーがでる? のが不思議です。

NoMethodError in Microposts#index とありますので、エラーは app/controllers/microposts_controller.rbにあるのではないでしょうか

あと、勘違いされているかも、なので追記
app/helpers/micropost_helper.rbに定義するmethodは Misropostのmethodではないです。viewのmethodです。
ですので
return User.find_by(id: self.user_id)
のselfはMicropostではありません。

selfをmicropostとして、User.find_by(id: self.user_id) と同じ結果を得るには
micropost.user でよいです。

投稿2019/07/21 21:25

編集2019/07/21 21:27
winterboum

総合スコア23329

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

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

k_yusuke

2019/07/22 03:10

ご回答ありがとうございます! まず、お役に立てるかわかりませんが質問文に記載してあるmicropostパーシャルの転送前を記載しておきます ```Indexhrml <%@microposts.each do |post|%> <%= render "microposts/micropost" %> <%end%> <%= paginate @microposts %> ``` MicropostControllerでは、indexアクション内で`@microposts=Micropost.all`と記載しています。 エラーがあったのは下記場所です。3行目はgravatarの行なのですがgarvatarを削除しても次のuserでエラーが出てしまうため、gravatarのエラーである可能性はなさそうです。 ``` Showing /home/ubuntu/environment/rails_app/app/views/microposts/_micropost.html.erb where line #3 raised: ``` MicropostClassのbelong_to,UserClassのhas_manyは記載されています。 またMicropostのメソッドについて理解不足だったのでググってきました。僕が実現したいのはMicropostのメソッドを用いてmicropost.user⇒記事に紐づいたユーザー参照、という動きなんだなと理解しました なので、わざわざヘルパーでメソッドを定義する必要はなさそうですね... すみません、長くなってしまいましたが引き続きご教授お願いします
winterboum

2019/07/22 04:23

文章ではなく、コードで相談の本文に載せて頂けませんか。取捨選択なしで。 質問者と回答者では着眼点が大抵の場合違いますから、元情報がないと難しいです 現時点で何が問題なのか、とそれに関わる コード、エラーメッセージを載せて整理しなおして頂けますか
k_yusuke

2019/07/22 06:22

本当にすみません..追記しなおしました! 足りないコードがあれば言ってください!
winterboum

2019/07/22 06:29

エラーを全文。 ファイルと行番号のある長いのが着いてるとおもうのですが
winterboum

2019/07/22 06:33

app/view/microposts/_micropost.html.erb に <li id="micropost-<%= micropost.id %>"> がありますが、microlost が未定義にみえるのですが、そのエラーがない? これはどこに定義してありますか
k_yusuke

2019/07/22 13:31

返信遅くなりました! エラーメッセージ記載しました。 micropostなんですがapp/view/microposts/_micropost.html.erbの1行目が抜けてしまっていました。 最初micropostが未定義だといわれたので、原因を探るためにビューの1行目にとりあえず置いておいたものです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問