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

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

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

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

Ruby

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

Q&A

1回答

1916閲覧

【Rails】undefined method `avatar_url'となってしまう

8fb659b6

総合スコア0

Ruby on Rails 5

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

Ruby

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

0グッド

0クリップ

投稿2022/02/04 05:49

やりたいこと

Twitterのような投稿アプリを作成しており、
プロフィール画面のビューであるshow.html内でavatar_urlメソッドを使用したいです。

エラーについて

以下のエラーが出てしまっております。
avatar_urlはヘルパーツールという認識なのですが、どうすればundefined methodとならないでしょうか。

Ruby

1#views/profile/show.html.erb 2<div class="container pt-3"> 3 <div class="row"> 4 <div class="col-md-10 offset-md-1"> 5 <h1 class="float-left mb-5">プロフィール</h1> 6 <%= link_to 'プロフィール編集', edit_profile_path, class: 'btn btn-success float-right' %> 7 <table class="table"> 8 <tr> 9 <th scope="row">メールアドレス</th> 10 <td><%= current_user.email %></td> 11 </tr> 12 <tr> 13 <th scope="row">氏名</th> 14 <td><%= "#{current_user.last_name} #{current_user.first_name}" %></td> 15 </tr> 16 <tr> 17 <th scope="row">アバター</th> 18 <td><%= image_tag current_user.avatar_url, size: '40x40', class: 'rounded-circle mr15'%></td> 19 </tr> 20 </table> 21 </div> 22 </div> 23</div>
#エラーメッセージ Started GET "/profile" for ::1 at 2022-02-04 14:34:45 +0900 Processing by ProfilesController#show as HTML User Load (0.3ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ? [["id", 1], ["LIMIT", 1]] ↳ /Users/kohei/.rbenv/versions/2.6.6/lib/ruby/gems/2.6.0/gems/activerecord-5.2.5/lib/active_record/log_subscriber.rb:98 Rendering profiles/show.html.erb within layouts/application Rendered profiles/show.html.erb within layouts/application (79.3ms) Completed 500 Internal Server Error in 90ms (ActiveRecord: 0.3ms) ActionView::Template::Error (undefined method `avatar_url' for #<User:0x00007fca842a1d80> Did you mean? avatar_was): 14: </tr> 15: <tr> 16: <th scope="row">アバター</th> 17: <td><%= image_tag current_user.avatar_url, size: '40x40', class: 'rounded-circle mr15'%></td> 18: </tr> 19: </table> 20: </div> app/views/profiles/show.html.erb:17:in `_app_views_profiles_show_html_erb___4093688988860818349_70253958272680'

その他参考箇所

avatar_uploader.rb

Ruby

1class AvatarUploader < CarrierWave::Uploader::Base 2 # Include RMagick or MiniMagick support: 3 # include CarrierWave::RMagick 4 # include CarrierWave::MiniMagick 5 6 # Choose what kind of storage to use for this uploader: 7 storage :file 8 # storage :fog 9 10 # Override the directory where uploaded files will be stored. 11 # This is a sensible default for uploaders that are meant to be mounted: 12 def store_dir 13 "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}" 14 end 15 16 # Provide a default URL as a default if there hasn't been a file uploaded: 17 # def default_url(*args) 18 # # For Rails 3.1+ asset pipeline compatibility: 19 # # ActionController::Base.helpers.asset_path("fallback/" + [version_name, "default.png"].compact.join('_')) 20 # 21 # "/images/fallback/" + [version_name, "default.png"].compact.join('_') 22 # end 23 24 # Process files as they are uploaded: 25 # process scale: [200, 300] 26 # 27 # def scale(width, height) 28 # # do something 29 # end 30 31 # Create different versions of your uploaded files: 32 # version :thumb do 33 # process resize_to_fit: [50, 50] 34 # end 35 36 # Add a white list of extensions which are allowed to be uploaded. 37 # For images you might use something like this: 38 # def extension_whitelist 39 # %w(jpg jpeg gif png) 40 # end 41 42 # Override the filename of the uploaded files: 43 # Avoid using model.id or version_name here, see uploader/store.rb for details. 44 # def filename 45 # "something.jpg" if original_filename 46 # end 47end

user.rb

Ruby

1class User < ApplicationRecord 2 authenticates_with_sorcery! 3 4 has_many :posts, dependent: :destroy 5 has_many :likes, dependent: :destroy 6 has_many :liked_posts, through: :likes, source: :post 7 8 validates :password, length: { minimum: 3 }, if: -> { new_record? || changes[:crypted_password] } 9 validates :password, confirmation: true, if: -> { new_record? || changes[:crypted_password] } 10 validates :password_confirmation, presence: true, if: -> { new_record? || changes[:crypted_password] } 11 12 validates :email, uniqueness: true 13 validates :email, presence: true 14 validates :first_name, presence: true, length: { maximum: 255 } 15 validates :last_name, presence: true, length: { maximum: 255 } 16 17 def mine?(object) 18 object.user_id == id 19 end 20 21 def like(post) 22 liked_posts << post 23 end 24 25 def unlike(post) 26 liked_posts.delete post 27 end 28 29 def like?(post) 30 liked_posts.include? post 31 end 32end

Ruby

1class ProfilesController < ApplicationController 2 before_action :set_user, only: %i[edit update] 3 4 def edit; end 5 6 def update 7 if @user.update(user_params) 8 redirect_to profile_path, success: t('defaults.message.updated', item: User.model_name.human) 9 else 10 flash.now['danger'] = t('defaults.message.not_updated', item: User.model_name.human) 11 render :edit 12 end 13 end 14 15 def show; end 16 17 private 18 19 def set_user 20 @user = User.find(current_user.id) 21 end 22 23 def user_params 24 params.require(:user).permit(:email, :last_name, :first_name, :avatar, :avatar_cache) 25 end 26 end 27

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

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

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

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

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

guest

回答1

0

model User に avatar の定義がないのが原因では?
AvatarUploader と User の関係を設定していないように見えます。

投稿2022/02/06 00:13

winterboum

総合スコア23284

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問