BUDOUTOU
@BUDOUTOU

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

<%= message.user.name%> これってモデル名.モデル名.カラム名ですか?

Q&A

Closed

毎回、表示する値が変わる場合
<%= message.user.name%>

このような記述で、書かれていますが
messageは...モデル名?
userは......モデル名?
nameは......カラム名?

どこと関連付いて、このような記述になっているのでしょうか?

_message.html.erb
<div class="message">
  <div class="upper-message">
    <div class="message-user">
      <%= message.user.name%>
    </div>
    <div class="message-date">
      <%= message.created_at%>
    </div>
  </div>
  <div class="lower-message">
    <div class="message-content">
      <%= message.content%>
    </div>
  </div>
</div>
0

2Answer

モデルクラスの定義が示されていないので推測がだいぶ混じりますが,恐らくこうだろう,ということを書きます。

テンプレートの

 <%= message.user.name%>

ですが,<%=%> の間には Ruby の式を書くのでしたね。
従って,

message.user.name

は Ruby の式です。

最初の message は,形からすると,①ローカル変数の参照か,②引数の無いメソッド呼び出し,のどちらかです。
このコードだけでは判定できませんが,Rails の部分テンプレートでファイル名が _message.html.erb というあたりからして,まあ①だろうな,と思いました。
そうだとすると,この部分テンプレートを呼び出すところで,ローカル変数 message の指定があるはずです。

また,Rails の典型的なコードだとすると,この message というローカル変数には,Message というモデルクラスのインスタンスが代入されているだろうな,と思います。

次の user ですが,message のあとにピリオドで繋いでいますので,これはメソッド呼び出しですね。
つまり,Message クラスのインスタンスの user メソッドを呼んでいます。
ま,典型的なケースとして,この user メソッドは Message クラスのインスタンスメソッドです(可能性としてはそうでないこともあります)。

どうして Message クラスに user というインスタンスメソッドがあるのでしょうか。
いろいろな可能性がありますが,ありがちなケースとして以下の二つがまず浮かびます。

Message モデルで belongs_to :user している
Message モデルが user という属性を持っている

①のケースでは,User というモデルクラスがあって,それに紐付けるための user_id という整数型の属性を Message が持っているんですね。そして,まあ例えば

class Message < ApplicationRecord
  belongs_to :user

end

みたいになってると。で,この belongs_to :user という記述によって,Message クラスに user というメソッドが生えるわけです(ココ大事)。
このメソッドの返り値は User クラスのインスタンスです。

②のケースは,言い換えれば Message モデルに対応して,データベースに messages というテーブルがあり,そのテーブルに user というカラムがある,ということですね。ActiveRecord の賢い働きにより,対応するテーブルに user というカラムがあればモデルクラスに user というメソッドが生えます(ココ大事)。

さて,ここでは,おそらく①だろうと当たりをつけて先に進みましょう。

message.user.name

という式を検討しているのでした。
ここまでの推測が全部当たっているとすると,message.user の返り値は User のインスタンスです。
次の .name は,その返り値に対して name メソッドを呼んでいることになります。
こんな風に,「メソッドの返り値に対してさらにメソッドを呼び……」という連鎖を「メソッドチェーン」と言います。

おそらくは User クラスに対応する users テーブルがあって,そこに name というカラムがあるのでしょう。
User のインスタンスメソッド name はそれに基づいて生やされたメソッドですね。

6Like

そうだと思います。

話を簡略化すると以下の様なのだと思います。

<% @messages.each do |message| %>
   <%= message.user.name %>
   <%= message.created_at %>
   <%= message.content %>
<%end %>

messages_controller.rb っぽい名前のファイルで値をとってきている処理はありませんか?
例えば以下のような処理です。

  def なんちゃら
    @messages.user = User.find_by(id: params[:id])
  end
0Like

Your answer might help someone💌