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

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

ただいまの
回答率

90.53%

  • Ruby on Rails

    8577questions

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

投稿に紐づいたユーザー名が意味不明な文字列で表示されてしまう

受付中

回答 3

投稿

  • 評価
  • クリップ 1
  • VIEW 609

現在投稿のページで、投稿を投稿したユーザーの名前を表示したいと思っていますが、#<User:0x00007fdfdcfe8350>さんが投稿しました。のような意味不明な文字列として表示されてしまいます。

postモデルとuserモデルがあり、それぞれカラムは以下のようになっています

create_table "posts", force: :cascade do |t|
t.text "content"
t.integer "user_id"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end

create_table "users", force: :cascade do |t|
t.string "name"
t.string "email"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end

postのshow.html.erbは以下のようになっています。

  <% @posts.each do |post| %>
      <div class="posts-index-item">
        <strong><%= post.content %></strong> <%= post.user.name %>さんが投稿しました。

アクションはこうです

  def show
@posts = Post.where(aaa_id: @aaa.id).paginate(:page => params[:page], :per_page => 10).order(created_at: :desc)
        @current_user = User.find_by(id: session[:user_id])
    end
end

なのに名前が表示されません。
何がいけないのでしょうか?
モデルでは
class User < ApplicationRecord
has_many :posts
end

class Post < ApplicationRecord
belongs_to :user

def user
return User.find_by(id: self.user_id)
end

end

としています

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

+2

「意味不明な文字列」

これは,User オブジェクトを文字列化したものです。

ためしに,

p Object.new.to_s

としてみましょう。すると

"#<Object:0x00007f8299a37640>"

といったような文字列が得られましたね。
文字化けとは一切関係ありません。

この文字列の Object の部分は,そのオブジェクトが属すクラスを表しています。

ご質問のケースでは,

#<User:0x00007fdfdcfe8350>

なので,User のインスタンスであることが分かります。

先を急がずもう少し説明します。以下のようなケースはどうでしょうか。

p Hash.new.to_s #=> "{}”

先ほどとは結果がまるで違いました。
これは,Hash クラスが自分専用の to_s メソッドを持っているからです。

User クラスの場合,専用の to_s メソッドが無いので,Object#to_s が呼ばれて,一見「意味不明な文字列」になるというわけですね。

さて,そうすると

show.html.erb における

<%= post.user.name %>さんが投稿しました。

の post.user.name は User のインスタンスであることが分かります。

これは甚だ奇妙なことですね。
post.user が User オブジェクトのはずですから。

この原因は私には分かりません。提示されているコードだけなら(あと変なコードが無ければ),こんなことはありえないように思えます。

ところで,Post のコードには変なところがあります。それは

def user
  return User.find_by(id: self.user_id)
end

として user メソッドを定義しているところです。
既に

belongs_to :user

があるわけですから,Post#user メソッドが使えるのに,それを上書きする形でメソッドを定義してしまっています。

これは削除しましょう。

ただ,これが #<User:0x00007fdfdcfe8350> の原因とも思えないんですよねえ。

こういうときは,テンプレートに byebug を埋め込んで(@posts のループの中など),post や post.user が一体何者なのかを調べてみるとよさそうです。

byebug の使い方が分からない場合は改めてご質問ください。

なお,nekoyama7 さんがおっしゃっているように,Post の show アクションは Post の一つの特定のインスタンスを表示するものなので,show アクションの中で @posts を定義してビューでループを回すのは適切ではありません。
それは index アクションの役割です。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/02/21 19:00

    ---オブジェクトが属すクラスを表しています---なるほど。勉強になりました。文字コードではないんですね。数字を文字列に変換するとき to_s を書かなくても、必要に応じて、自動的に変換される言語もあるので、うっかりミスに注意ですね。後で、Ruby の型変換を復習します。

    キャンセル

0

こんにちは。文字コードの問題では? Windows 標準の shift JIS という文字コードを Rails 標準の(たぶん?)unicode(UTF-8)として扱おうとしているのかも? テーブルの中の投稿者の氏名の文字コードが、何なのでしょう?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/02/20 18:28

    すまみせん、使っているのはMACです
    氏名の文字はstringです

    キャンセル

  • 2018/02/20 18:44

    Mac なら、たぶん UTF-8 になってますね。念のため、以下を。
    今、手元で Rails を開けないのですが、開発用(development)、テスト用(test)、本番用(production)、各々、データベース設定ファイル(database.yml)があると思います。そこで、文字コード(encoding)設定できると思います。デフォルトの設定は、UTF-8 でしょう。

    キャンセル

  • 2018/02/20 19:21

    でも投稿は普通に日本語で表示されているのですよね
    文字コードはどうやって変更したら良いですか?

    キャンセル

  • 2018/02/20 19:26

    文字コードを変えてみましたが、ダメでした。。。

    キャンセル

  • 2018/02/20 19:41

    database.yml を私は、変更したことはないのですが、ここで文字コードを定義、変更できると思います。まず、開いて中身の確認をおすすめします。
    SQLite3 を使っておられる(Rails のデフォルト)のでしょうか? rails には、以下のコマンドで、直接、データベースに接続できる、dbコンソールがあります。
    開始は Mac の UNIX の shell >rails dbconsole
    そして、SQL の select 文で氏名を表示、ここで、きちんと読める(文字化けしてない)なら、UTF-8 でしょう。Mac の shell の設定によりますが。
    終了は >.quit----ドットquit です。

    キャンセル

0

おくればせながら、プログラムを読ませていただきました。以下が原因かも?

@posts--先頭に'@'が付く変数は、インスタンス変数。これは、1個のオブジェクトを示すので、単数形では? 's'が最後につくのは、おかしいのでは?

show は、1個のレコード(この場合は、1個の投稿)でしょう。each のループは、どうも腑に落ちません。

以下の post を @post にすれば表示されるかも? 先頭に'@'です。
<strong>『<%= post.content %>』</strong> <%= post.user.name %>

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

同じタグがついた質問を見る

  • Ruby on Rails

    8577questions

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