ローカル環境で開発しており、Rails(API)からusersテーブルとrecipesテーブルをJoinしてデータを取り出しています。画像保存にはGemのcarrierwaveを使用して画像をDBに保存しています。Reactでは取り出したデータを表示するだけとなります。取り出したデータの内、recipeImageのurlだけ取れない状況にあります。原因が分からず困っています。どなたかご教授していただけませんか?
#Rails実装
schema.rb(一部省略しています)
Rails
1ActiveRecord::Schema.define(version: 2021_08_06_122553) do 2 create_table "recipes", charset: "utf8mb4", force: :cascade do |t| 3 t.integer "user_id" 4 t.string "title" 5 t.string "recipe_image" 6 t.text "material" 7 t.text "body" 8 t.datetime "created_at", precision: 6, null: false 9 t.datetime "updated_at", precision: 6, null: false 10 end 11 12 create_table "users", charset: "utf8mb4", force: :cascade do |t| 13 t.string "name" 14 t.string "email" 15 t.string "image" 16 t.string "profile" 17 end 18end
image_uploader.rb
Rails
1class ImageUploader < CarrierWave::Uploader::Base 2 storage :file 3 4 def store_dir 5 "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}" 6 end 7 8 # 受け付け可能なファイルの拡張子を指定 9 def extension_allowlist 10 %w(jpg jpeg png) 11 end 12end
carrierwave.rb
Rails
1CarrierWave.configure do |config| 2 config.asset_host = "http://localhost:3001" 3 config.storage = :file 4 config.cache_storage = :file 5end
models/user.rb
class User < ActiveRecord::Base devise :database_authenticatable, :registerable, :recoverable, :rememberable, :validatable include DeviseTokenAuth::Concerns::User mount_uploader :image, ImageUploader has_many :recipes, dependent: :destroy end
models/recipe.rb
class Recipe < ApplicationRecord mount_uploader :recipe_image, ImageUploader belongs_to :user end
recipes_controller.rb
Rails
1class Api::V1::RecipesController < ApplicationController 2 def index 3 @recipes = User.joins(:recipes).select("users.*,recipes.*") 4 @recipes.order(updated_at: :desc) 5 render json: @recipes 6 end 7end
#React実装
index.ts
React
1export interface User { 2 id?: number 3 uid?: string 4 provider?: string 5 email?: string 6 name?: string 7 image?: { 8 url: string 9 } 10 profile?: string 11 allowPasswordChange?: boolean 12 created_at?: Date 13 updated_at?: Date 14 } 15 16 export interface ShowRecipes extends User { 17 id?: number 18 user_id?: number 19 title?: string 20 recipeImage?:{ 21 url: string 22 } 23 material?:string 24 body?: string 25 }
Top.tsx
1return( 2 <> 3 <div className="w-full flex flex-wrap justify-between"> 4 { 5 recipes.map((recipe) => ( 6 <Card className="my-1 px-1 w-64 md:w-1/2 lg:my-4 lg:px-4 lg:w-64" key={recipe.id}> 7 <div className="my-4"> 8 <div> 9 <Link to = {`${`/showRecipe/${recipe.id}`}`}> 10 <img alt="Placeholder" className="block w-64 h-64" src={recipe.recipeImage?.url}/> 11 </Link> 12 </div> 13 <div className="my-4"> 14 <h1 className="text-lg text-current font-bold"> 15 <Link to = {`${`/showRecipe/${recipe.id}`}`} 16 className="no-underline hover:underline text-black"> 17 {recipe.title} 18 </Link> 19 </h1> 20 </div> 21 <div className="flex items-center justify-between leading-none"> 22 {/* アイコン画像 */} 23 <Link to = "#" 24 className="flex items-center no-underline hover:underline text-black"> 25 <img alt="Placeholder" className="block rounded-full w-8 h-8" src={recipe.image?.url}/> 26 <p className="ml-2 text-sm"> 27 {recipe.name} 28 </p> 29 </Link> 30 </div> 31 </div> 32 </Card> 33 )) 34 } 35 </div> 36 </> 37)
あなたの回答
tips
プレビュー