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

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

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

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

Q&A

3回答

645閲覧

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

galaxymaximum

総合スコア11

Ruby on Rails

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

0グッド

1クリップ

投稿2018/02/20 09:16

現在投稿のページで、投稿を投稿したユーザーの名前を表示したいと思っていますが、#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

としています

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

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

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

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

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

guest

回答3

0

「意味不明な文字列」

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

ためしに,

rb

1p Object.new.to_s

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

rb

1"#<Object:0x00007f8299a37640>"

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

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

ご質問のケースでは,

#<User:0x00007fdfdcfe8350>

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

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

rb

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

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

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

さて,そうすると

show.html.erb における

erb

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

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

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

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

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

rb

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

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

rb

1belongs_to :user

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

これは削除しましょう。

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

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

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

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

投稿2018/02/21 00:00

scivola

総合スコア2108

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

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

nekoyama7

2018/02/21 10:00

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

0

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

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

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

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

投稿2018/02/20 13:41

nekoyama7

総合スコア200

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

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

0

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

投稿2018/02/20 09:26

nekoyama7

総合スコア200

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

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

galaxymaximum

2018/02/20 09:28

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

2018/02/20 09:44

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

2018/02/20 10:21

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

2018/02/20 10:26

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

2018/02/20 10:41

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問