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

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

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

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

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

2回答

641閲覧

form_forを用いてDBに値を保存したい

Junun

総合スコア0

Ruby

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

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

0クリップ

投稿2020/05/25 14:17

前提・実現したいこと

Ruby on Rails5でwebアプリを作成しています。
form_forメソッドを用いて入力フォームをビューに作成し、
コントローラで保存する処理を記述したつもりです。
エラーはないのですが、
SQLで見てみると値が保存されていません。

発生している問題・エラーメッセージ

エラーは出ないが、SQLに実際のデータが保存されていない。
投稿の内容をDBに保存する場合はform_forではなくform_tagを使わなければならないのでしょうか。

該当のソースコード

Ruby

1#tweets_controller.rb 2 3class TweetsController < ApplicationController 4 def index 5 @tweets = Tweet.all 6 end 7 8 def new 9 @tweets = Tweet.new 10 11 end 12 13 def create  14 Tweet.create(tweet_params) 15 end 16 17 private 18 def tweet_params 19 params.permit(:name, :title, :text) 20 end 21end 22

HTML

1# <tweets/new.html.erb> 2 3<div class="d-flex align-items-center"> 4 <h1>投稿</h1> 5 <div class="ml-auto posts_button"> 6 <a class="btn btn-outline-info" href="/tweets">投稿一覧</a> 7 </div> 8</div> 9<%= form_for @tweets do |f| %> 10 <div class="form-group"> 11 <%= f.label :name, '投稿者名' %> 12 <%= f.text_field :name, class: 'form-control' %> 13 <small id="poster-tip" class="form-text text-muted"> 14 あなたのuser名を入力してください。 15 </small> 16 </div> 17 <div class="form-group"> 18 <%= f.label :title, '投稿タイトル' %> 19 <%= f.text_field :title, class: 'form-control' %> 20 <small id="title-tip" class="form-text text-muted"> 21 タイトルを入力してください。 22 </small> 23 </div> 24 <div class="form-group"> 25 <%= f.label :text, '投稿内容' %> 26 <%= f.text_area :text, class: 'form-control', rows:10 %> 27 <small id=content-tip" class="form-text text-muted"> 28 投稿内容を入力してください。 29 </small> 30 </div> 31 <%= f.submit '投稿', class: 'btn btn-info btn-block' %> 32 <small id="submit-tip" class="form-text text-muted"> 33 投稿する前に投稿内容を見直してください! 34 </small> 35<% end %>

Ruby

1#rails routesの結果 2 Prefix Verb URI Pattern Controller#Action 3 root GET / tweets#index 4 tweets GET /tweets(.:format) tweets#index 5 POST /tweets(.:format) tweets#create 6 new_tweet GET /tweets/new(.:format) tweets#new 7 rails_service_blob GET /rails/active_storage/blobs/:signed_id/*filename(.:format) active_storage/blobs#show 8rails_blob_representation GET /rails/active_storage/representations/:signed_blob_id/:variation_key/*filename(.:format) active_storage/representations#show 9 rails_disk_service GET /rails/active_storage/disk/:encoded_key/*filename(.:format) active_storage/disk#show 10update_rails_disk_service PUT /rails/active_storage/disk/:encoded_token(.:format) active_storage/disk#update 11 rails_direct_uploads POST /rails/active_storage/direct_uploads(.:format) active_storage/direct_uploads#create

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

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

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

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

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

guest

回答2

0

form_forではなくform_tag

関係ありません。どちらでも
保存されていないのは、保存するコマンドがないからです。

Rails では新規にでレコードを作るとき次のような(大まかな)流れになります。
0. コントローラのnewが呼ばれて@tweetインスタンスが作られる
0. ビューでフォームが作られる
0. サブミットされるとコントローラのcreateが呼ばれ、データを保存する

def create 
Tweet.create(tweet_params)
end

ですので、保存するsaveメソッド(コマンドがありません)。チュートリアルやひな形でdef createがどんなコードになっているか確かめましょう。

投稿2020/05/25 14:26

NCC1701

総合スコア1680

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

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

Mugheart

2020/05/25 14:46

create は INSERT文を発行するのでDBに保存できますよ。
Junun

2020/05/26 07:53

そうですよね
guest

0

params.require(:tweet).permit(:name, :title, :text)
で行けるかな。
だめだったら、logの Started POST から次のStartedまでを載せてください

投稿2020/05/25 14:20

winterboum

総合スコア23567

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

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

Junun

2020/05/25 16:16

params.require(:tweet).permit(:name, :title, :text)でも同じ感じでした。 Started POST "/tweets" for 61.193.25.160 at 2020-05-25 16:11:15 +0000 Cannot render console from 61.193.25.160! Allowed networks: 127.0.0.1, ::1, 127.0.0.0/127.255.255.255 Processing by TweetsController#create as HTML Parameters: {"utf8"=>"✓", "authenticity_token"=>"Jkf9qb9abjF+hUKf3kbs62TODiB2GFouNLMnMp/l7Vy9yfGgRsAGteJViuuSqVhgwmpRSPRu3Jfyt6fjFCFcEw==", "tweet"=>{"name"=>"jun", "title"=>"飲み会", "text"=>"オンライン飲み会\r\n"}, "commit"=>"投稿"} Rendering tweets/create.html.erb within layouts/application Rendered tweets/create.html.erb within layouts/application (0.3ms) Completed 200 OK in 4ms (Views: 2.5ms | ActiveRecord: 0.0ms)
Junun

2020/05/25 16:20

もしかすると Started GET "/tweets/new" for 61.193.25.160 at 2020-05-25 16:11:06 +0000 Cannot render console from 61.193.25.160! Allowed networks: 127.0.0.1, ::1, 127.0.0.0/127.255.255.255 (0.2ms) SET NAMES utf8, @@SESSION.sql_mode = CONCAT(CONCAT(@@sql_mode, ',STRICT_ALL_TABLES'), ',NO_AUTO_VALUE_ON_ZERO'), @@SESSION.sql_auto_is_null = 0, @@SESSION.wait_timeout = 2147483 ↳ /home/ec2-user/.rvm/gems/ruby-2.5.1/gems/activerecord-5.2.4.2/lib/active_record/log_subscriber.rb:98 Processing by TweetsController#new as HTML Rendering tweets/new.html.erb within layouts/application Rendered tweets/new.html.erb within layouts/application (1.5ms) Completed 200 OK in 12ms (Views: 3.9ms | ActiveRecord: 0.9ms) ここのlogに問題があるでしょうか
winterboum

2020/05/25 20:30

はて、、、 params.require(:tweet).permit(:name, :title, :text) とrequire入れてやりました?
Junun

2020/05/26 05:29

はい、やりました。 params.permit(:name, :title, :text)これの代わりにってことですよね?
winterboum

2020/05/26 06:46

はて、、、 POSTのlogのところ、createなのにINSERTの形跡も無いのが???
asm

2020/05/26 08:41

Tweet.createをTweet.create!にしてログを見てみるのを私だったらオススメしますね。 たぶん、検証失敗でしょうし下手するとuser_idなんかをvalidateしてる可能性がありそう。
Junun

2020/05/26 08:46

ですよね
Junun

2020/05/26 12:23

すみません もし勘違いされてたらなので一応、ですよね、はwinterboumさんに返信したものです。
Junun

2020/05/26 12:24

asmさんありがとうございます。やってみます
Junun

2020/05/26 12:36

!をTweet.create(tweet_params)! に付けた時しか logが変わらず、この時はsyntax errorが出ただけでした
Junun

2020/05/26 12:50

ちなみにvalidationはかけていません
Junun

2020/05/26 12:59

form_forのところを <%= form_tag('/tweets', method: :post) do %> <input type="text" name="name" placeholder="Nickname"> <input type="text" name="title" placeholder="title"> <textarea name="text" placeholder="text" rows="10" cols="30"></textarea> <input type="submit" value="SEND"> <% end %> にしたらできました。 この場合form_forではダメなのでしょうか
winterboum

2020/05/26 13:39

Tweet.create(tweet_params)! ではないですTweet.create!(tweet_params) です <input type="text" name="name" placeholder="Nickname"> で通るということは、 params.require(:tweet).permit(:name, :title, :text) ではなく params.permit(:name, :title, :text) ですね?
Junun

2020/05/27 02:19

Tweet.create!(tweet_params)でもlogは変わらないんですよね params.permit(:name, :title, :text)でも同じでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問