React(TypeScript)、Formik、Rails API、ActiveStorage、で画像投稿機能を作成したい。
React(TypeScript)、Formik、Rails API、ActiveStorage、で画像投稿機能を作成したいのですが、うまく行かずに困っております。
発生している問題・エラーメッセージ
Rails
1ActiveSupport::MessageVerifier::InvalidSignature (ActiveSupport::MessageVerifier::InvalidSignature):
どんなデータをサーバーサイドに送っているのか確認したところ
console
1data:image/gif;base64,R0lGODlhigJVAfcAAKi7yO309RUj…ol7Gk2dhNkgZOqxEb/WIQwqVpZneO4EehDbqg8FQqAQEAOw=="
このようになっていました。
該当のソースコード
TypeScript
1import React, { 2 ChangeEvent, 3 createRef, 4} from 'react' 5import { makeStyles } from '@material-ui/core/styles'; 6import Card from '@material-ui/core/Card'; 7import CardContent from '@material-ui/core/CardContent'; 8import { Field, Form, Formik } from "formik"; 9import { TextField } from "formik-material-ui"; 10import { 11 Button, 12 Grid, 13 LinearProgress, 14} from "@material-ui/core"; 15import CancelTwoToneIcon from '@material-ui/icons/CancelTwoTone'; 16 17export default function PostNewForm(props: any) { 18 19 const classes = useStyles(); 20 const [src, setSrc] = React.useState('') 21 const ref = createRef<HTMLInputElement>() 22 const [state, setState] = React.useState({ 23 status: true, 24 }); 25 26//プレビュー処理 27 const onClick = () => { 28 if (ref.current) { 29 ref.current.click() 30 } 31 } 32 const onChange = (event: ChangeEvent<HTMLInputElement>, setFieldValue: any) => { 33 if (event.target.files === null) { 34 return 35 } 36 const file = event.target.files.item(0) 37 if (file === null) { 38 return 39 } 40 var reader = new FileReader() 41 reader.readAsDataURL(file) 42 reader.onload = () => { 43 setSrc(reader.result as string) 44 } 45 } 46 return ( 47 <React.Fragment> 48 <Card className={classes.root}> 49 <CardContent> 50 {src && 51 <React.Fragment> 52 <img src={src} style={{width: '100%'}}/> 53 </React.Fragment> 54 } 55 <Formik 56 onSubmit={async value => { 57 try { 58 const post ={ 59 image: src, 60 user_id: props.user.id 61 } 62 await 63 axios.post('http://localhost:3000/api/v1/posts',{post: post} 64 console.log(post); 65 } catch (error) { 66 alert(error.message); 67 } 68 }} 69 render={({ submitForm, isSubmitting, isValid, setFieldValue}) => ( 70 <Form> 71 <Grid container className={classes.root} spacing={2}> 72 {isSubmitting && <LinearProgress />} 73 <Grid item xs={12}> 74 <Field 75 name="image" 76 accept="image" 77 type="file" 78 onChange={(event: ChangeEvent<HTMLInputElement>) => onChange(event,setFieldValue)} 79 onClick={onClick} 80 /> 81 </Grid> 82 83 <Grid item xs={12}> 84 <Button 85 type="submit" 86 disabled={!isValid || isSubmitting} 87 > 88 投稿 89 </Button> 90 </Grid> 91 </Grid> 92 </Form> 93 )} 94 /> 95 </CardContent> 96 </Card> 97 </React.Fragment> 98 ); 99}
rails
1#post model 2class Post < ApplicationRecord 3 belongs_to :user 4 has_one_attached :image 5end 6
rails
1 def create 2 post = Post.new(post_params) 3 if post.save 4 render json: post 5 else 6 render json: post.errors 7 end 8 end 9 10 private 11 12 def post_params 13 params.require(:post).permit(:user_id, :image) 14 end 15
試したこと
const post ={ image: src, }
を
const post ={ image: value.image, }
にしてみた。
補足情報(FW/ツールのバージョンなど)
ruby '2.6.5'
gem 'rails', '~> 6.0.3', '>= 6.0.3.2'
分かる方いらっしゃいましたらよろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。