🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby on Rails

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

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

解決済

1回答

1159閲覧

React(TypeScript)、Formik、Rails API、ActiveStorage、で画像投稿機能を作成したい。

masa_engin

総合スコア15

Ruby on Rails

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

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

0グッド

0クリップ

投稿2020/11/29 14:14

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'

分かる方いらっしゃいましたらよろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

自己解決

let img = new Image();
img.src = URL.createObjectURL(event.target.files[0]);

この辺を追記して解決

投稿2020/11/30 06:00

masa_engin

総合スコア15

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問