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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Devise

Deviseとは、Ruby-on-Railsの認証機能を追加するプラグインです。

Ruby

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

Ruby on Rails 6

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

Ruby on Rails

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

Q&A

解決済

1回答

839閲覧

railsのdeviceを使って他のユーザーページでその人のユーザー名などを表示させる方法

hiromix

総合スコア7

Devise

Deviseとは、Ruby-on-Railsの認証機能を追加するプラグインです。

Ruby

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

Ruby on Rails 6

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

Ruby on Rails

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

0グッド

0クリップ

投稿2021/09/23 06:12

編集2021/09/23 13:46

こんにちは(^▽^)
現在、railsのdeviceを使っていて他のユーザーページを閲覧したときにその人の
ユーザー名を表示させたいのですが表示できません。

Viewテンプレート <h1><%= user.name %>のプロフィールページ</h1>

controller

class UsersController < ApplicationController #before_action :set_user, only: ["index", "show"] ※before_actionはよくわからないのでコメントアウトしています def index @users = User.all end def show @user = User.find_by(params[:account_name]) end

他にも下記のように書いたりしています
@user = User.find_by(params[:name])
@user = User.find(params[:id])

routes

Rails.application.routes.draw do devise_for :users root 'users#index' resources :users, only: [:show,:index,:edit,:update,:destroy] end

model

class User < ApplicationRecord # Include default devise modules. Others available are: # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable devise :database_authenticatable, :registerable, :recoverable, :rememberable, :validatable validates :account_name, uniqueness: true, format: { with: /\A[a-zA-Z\d]+\z/ }, length: { minimum: 3, maximum: 25 } def to_param return self.account_name end end

これで表示させると、

Userのユーザーページです

となります。なぜエラーにならずにこのようになるのでしょうか?

いくつか調べて、下記のコードを使ってみたところ、
@users = User.find_by(id: params[:id])エラーになりました。

indexページではユーザー一覧を表示させていて、そこからusers/showへ飛ばすことはできています。
テーブル名はusersになります。
カラムについては、nameは漢数字など使えるようにしていて、account_nameは英数字のみです。

<% @users.each do |user| %> <%= link_to(user.name, "/users/#{user.account_name}") %> <% end %>

上記で問題なく動くので、user.nameをusers/showでも使えるものかと思っていましたが使えません。

ただ、
@user = User.find(params[:id])にして http://localhost:3000/users/9 などでそのページに移動すると、ユーザー名は表示されます。

どなたかお詳しい方ご教授お願い致しますm(__)m

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

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

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

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

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

m.ts10806

2021/09/23 07:26

コードが一部過ぎると思います。 ルーティング、モデル含めて提示してください。
hiromix

2021/09/23 07:43

失礼しました。 ご指摘ありがとうございます。追加いたしました!
guest

回答1

0

ベストアンサー

これだとエラーになるはずです。
ならないとすると、載せてあるcodeが断片なので、省略してあるところに原因があるのかと思いますが、それは見当付きません。

表示されないのは、<%= user.name %> のuserが未定義だからです。
というか、
未定義だとエラーになるので、なんかしてあるのかと思いますが。。。。
一般的なやり方は
controller で、 @user = User.ここに適切な検索式 としておいて、<%= @user.name %> とします。
適切な検索式、ですが、、、
これを呼ぶlinkが link_to(user.name, "/users/#{user.account_name}") と不思議な式になっているので、それに沿った式にしてください。
find_by(account_name: params[:id]) かなぁ。。。
一般的にはlinkは "/users/#{user.id}"なのですが、ここを変えたのはなぜ?

投稿2021/09/23 09:08

winterboum

総合スコア23284

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

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

hiromix

2021/09/23 13:32

ご回答ありがとうございます。 最初 http://localhost:3000/idで viewに「○○のユーザーページです」という表示は問題なくできておりましたが、 URLにユーザーアカウントを含ませたいために最終的にこの形となりました。 link_to(user.name, "/users/#{user.account_name}")
winterboum

2021/09/23 13:48

で、@user= はうまく行きました?
hiromix

2021/09/23 14:43

素晴らしいご回答ありがとうございます。 さきほど、controllerを下記のようにしたところ無事に表示されました! URLもユーザー名が入った状態です。 controller def show @user = User.find_by(account_name: params[:id]) end view <%= @user.name %>のユーザーページです</h1>
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問