Rails初心者です。
post.user.image_nameの方は表示されるのですが、
post.post.post_imageはメソッドエラーが出てしまい表示できません。
どこがおかしいのでしょうか?
index.html.erb
rails
1<div class="main posts-index"> 2 <div class="container"> 3 <% @posts.each do |post| %> 4 <div class="posts-index-item"> 5 <div class="post-left"> 6 <!-- ユーザーの画像が表示されるように、以下のsrcに値を追加してください --> 7 8 <img src="<%= "/#{post.user.image_name}" %>"> 9 </div> 10 <div class="post-right"> 11 <img src="<%= "/post_images/#{post.post.post_image}" %>"> 12 13 14 <div class="post-user-name"> 15 16 <!-- link_toメソッドを用いて、ユーザー詳細ページへのリンクを作成してください --> 17 18 </div> 19 <%= link_to(post.content, "/posts/#{post.id}") %> 20 21 </div> 22 23 </div> 24 25 <% end %> 26 </div> 27 28</div> 29
posts_controller.rb
rails
1class PostsController < ApplicationController 2 before_action :authenticate_user 3 before_action :ensure_correct_user, {only: [:edit, :update, :destroy]} 4 5 def index 6 @posts = Post.all.order(created_at: :desc) 7 end 8 9 def show 10 @post = Post.find_by(id: params[:id]) 11 @user = @post.user 12 # 変数@likes_countを定義してください 13 @likes_count = Like.where(post_id: @post.id).count 14 end 15 16 def new 17 @post = Post.new 18 end 19 20 def create 21 @post = Post.new( 22 content: params[:content], 23 user_id: @current_user.id) 24 #,post_image: nil) 25 @post.save 26 27 if @post.save 28 29 if params[:post_image] 30 @post.post_image = "#{@post.id}.jpg" 31 image = params[:post_image] 32 File.binwrite("public/post_images/#{@post.post_image}",image.read) 33 end 34 35 flash[:notice] = "投稿を作成しました" 36 redirect_to("/posts/index") 37 else 38 render("posts/new") 39 end 40 end 41 42 43 def edit 44 @post = Post.find_by(id: params[:id]) 45 end 46 47 def update 48 @post = Post.find_by(id: params[:id]) 49 @post.content = params[:content] 50 if @post.save 51 flash[:notice] = "投稿を編集しました" 52 redirect_to("/posts/index") 53 else 54 render("posts/edit") 55 end 56 end 57 58 def destroy 59 @post = Post.find_by(id: params[:id]) 60 @post.destroy 61 flash[:notice] = "投稿を削除しました" 62 redirect_to("/posts/index") 63 end 64 65 def ensure_correct_user 66 @post = Post.find_by(id: params[:id]) 67 if @post.user_id != @current_user.id 68 flash[:notice] = "権限がありません" 69 redirect_to("/posts/index") 70 end
users_controller.rb
rails
1class UsersController < ApplicationController 2 before_action :authenticate_user, {only: [:index, :show, :edit, :update]} 3 before_action :forbid_login_user, {only: [:new, :create, :login_form, :login]} 4 before_action :ensure_correct_user, {only: [:edit, :update]} 5 6 def index 7 @users = User.all 8 end 9 10 def show 11 @user = User.find_by(id: params[:id]) 12 end 13 14 def new 15 @user = User.new 16 end 17 18 def create 19 @user = User.new( 20 name: params[:name], 21 email: params[:email], 22 image_name: "054.jpg", 23 password: params[:password] 24 ) 25 if @user.save 26 session[:user_id] = @user.id 27 flash[:notice] = "ユーザー登録が完了しました" 28 redirect_to("/users/#{@user.id}") 29 else 30 render("users/new") 31 end 32 end 33 34 def edit 35 @user = User.find_by(id: params[:id]) 36 end 37 38 def update 39 @user = User.find_by(id: params[:id]) 40 @user.name = params[:name] 41 @user.email = params[:email] 42 43 if params[:image] 44 @user.image_name = "#{@user.id}.jpg" 45 image = params[:image] 46 File.binwrite("public/#{@user.image_name}", image.read) 47 end 48 49 if @user.save 50 flash[:notice] = "ユーザー情報を編集しました" 51 redirect_to("/users/#{@user.id}") 52 else 53 render("users/edit") 54 end 55 end 56 57 def login_form 58 end 59 60 def login 61 @user = User.find_by(email: params[:email], password: params[:password]) 62 if @user 63 session[:user_id] = @user.id 64 flash[:notice] = "ログインしました" 65 redirect_to("/posts/index") 66 else 67 @error_message = "メールアドレスまたはパスワードが間違っています" 68 @email = params[:email] 69 @password = params[:password] 70 render("users/login_form") 71 end 72 end 73 74 def logout 75 session[:user_id] = nil 76 flash[:notice] = "ログアウトしました" 77 redirect_to("/login") 78 end 79 80 def likes 81 # 変数@userを定義してください 82 @user = User.find_by(id: params[:id]) 83 84 # 変数@likesを定義してください 85 @likes = Like.where(user_id: @user.id) 86 end 87 88 def ensure_correct_user 89 if @current_user.id != params[:id].to_i 90 flash[:notice] = "権限がありません" 91 redirect_to("/posts/index") 92 end
application_record.rb
rails
1class ApplicationRecord < ActiveRecord::Base 2 self.abstract_class = true 3end 4
like.rb
rails
1class Like < ApplicationRecord 2 validates :user_id, {presence: true} 3 validates :post_id, {presence: true} 4 end 5
post.rb
rails
1class Post < ApplicationRecord 2 validates :content, {presence: true, length: {maximum: 140}} 3 validates :user_id, {presence: true} 4 5 # インスタンスメソッドuserを定義してください 6 def user 7 return User.find_by(id: self.user_id) 8 end 9 10end 11
user.rb
rails
1class User < ApplicationRecord 2 validates :name, {presence: true} 3 validates :email, {presence: true, uniqueness: true} 4 validates :password, {presence: true} 5 6 # インスタンスメソッドpostsを定義してください 7 def posts 8 return Post.where(user_id: self.id) 9 end 10 11end 12
schema.rb
rails
1# This file is auto-generated from the current state of the database. Instead 2# of editing this file, please use the migrations feature of Active Record to 3# incrementally modify your database, and then regenerate this schema definition. 4# 5# Note that this schema.rb definition is the authoritative source for your 6# database schema. If you need to create the application database on another 7# system, you should be using db:schema:load, not running all the migrations 8# from scratch. The latter is a flawed and unsustainable approach (the more migrations 9# you'll amass, the slower it'll run and the greater likelihood for issues). 10# 11# It's strongly recommended that you check this file into your version control system. 12 13ActiveRecord::Schema.define(version: 2020_10_30_055415) do 14 15 create_table "likes", force: :cascade do |t| 16 t.integer "user_id" 17 t.integer "post_id" 18 t.datetime "created_at", null: false 19 t.datetime "updated_at", null: false 20 end 21 22 create_table "posts", force: :cascade do |t| 23 t.text "content" 24 t.datetime "created_at", null: false 25 t.datetime "updated_at", null: false 26 t.integer "user_id" 27 t.string "post_image" 28 end 29 30 create_table "users", force: :cascade do |t| 31 t.string "name" 32 t.string "email" 33 t.datetime "created_at", null: false 34 t.datetime "updated_at", null: false 35 t.string "image_name" 36 t.string "password" 37 end 38 39end
追記
index.html.erbの中の
<img src="<%= "/post_images/#{post.post.post_image}" %>">を
<img src="<%= "/post_images/#{post.post_image}" %>">
に変更し、エラーは消えましたが画像がうまく表示できませんでした。
モデルのリレーションはどうなっているのでしょうか。
こうなっております。
application_record.rb
class ApplicationRecord < ActiveRecord::Base
self.abstract_class = true
end
like.rb
class Post < ApplicationRecord
validates :content, {presence: true, length: {maximum: 140}}
validates :user_id, {presence: true}
# インスタンスメソッドuserを定義してください
def user
return User.find_by(id: self.user_id)
end
end
post.rb
class Post < ApplicationRecord
validates :content, {presence: true, length: {maximum: 140}}
validates :user_id, {presence: true}
# インスタンスメソッドuserを定義してください
def user
return User.find_by(id: self.user_id)
end
end
user.rb
class User < ApplicationRecord
validates :name, {presence: true}
validates :email, {presence: true, uniqueness: true}
validates :password, {presence: true}
# インスタンスメソッドpostsを定義してください
def posts
return Post.where(user_id: self.id)
end
end
質問は編集できますし、こちらのコメント欄ではマークダウン使えませんので原則質問本文を更新してください
追加いたしました、よろしくお願いします。
schema.rbを追記して頂けませんか?
追加いたしました。よろしくお願いします。
回答1件
あなたの回答
tips
プレビュー