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

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

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

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

Ruby on Rails

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

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Q&A

解決済

1回答

222閲覧

Ruby on Rails で新規投稿機能を実装したがdbに保存できない

satoukouhei

総合スコア1

Ruby

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

Ruby on Rails

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

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

0グッド

0クリップ

投稿2023/11/27 03:29

新規投稿を保存したいです

  • 新規投稿機能を動作し、保存できるようにしたいです。

前提

Ruby on Railsで読書を習慣化できるようにタスク管理できるアプリを作ってます。
新規投稿ページで
タイトルと時間と内容をフォームに記述したら保存できるよ西谷のですができません。

該当のソースコード

app/views/reads/index.html.erb

ruby

1<%= render "shared/header" %> 2 3 <% if user_signed_in? %> 4 <div class="greeting"> 5 <%= "こんにちは、#{current_user.nickname}さん!" %> 6 </div> 7 <% else %> 8 <% end %> 9 10<p id="notice"><%= notice %></p> 11 12<div class="toppage"> 13<h1 class="top">カレンダー</h1> 14<%= link_to 'イベント追加', new_read_path %> 15 16 17<div class="col-md-8"> 18<%= month_calendar reads: @reads do |date, reads| %> 19 <%= date.day %> 20 21 <% reads.each do |read| %> 22 <div> 23 <%= link_to read.title, read %> 24 </div> 25 <% end %> 26<% end %> 27</div> 28</div> 29</div> 30

app/views/reads/new.html.erb

ruby

1<%= form_with(model: @read, local: true) do |form| %> 2 3 <div class="title"> 4 <%= form.label :title %> 5 <%= form.text_field :title %> 6 </div> 7 8 <div class="time"> 9 <%= form.label :start_time %> 10 <%= form.datetime_select :start_time %> 11 </div> 12 13 <div class="content"> 14 <%= form.label :content %> 15 <%= form.text_field :content %> 16 </div> 17 18 19 <div class="submit"> 20 <%= form.submit %> 21 </div> 22 23<% end %> 24 25 26

config/routes

ruby

1Rails.application.routes.draw do 2 devise_for :users 3 4 root to: "reads#index" 5 resources :reads 6end 7

app/controllers/reads_controller.rb

ruby

1class ReadsController < ApplicationController 2 3 def index 4 @reads = Read.all 5 @read = Read.new 6 end 7 8 def new 9 @read = Read.new 10 end 11 12 def show 13 @read = Read.find(params[:id]) 14 end 15 16 def create 17 @read = Read.new(read_parameter) 18 19 if @read.save 20 redirect_to reads_path, notice: '投稿が保存されました' 21 else 22 render 'new' 23 end 24 end 25 26 def destroy 27 @read = Read.find(params[:id]) 28 @read.destroy 29 redirect_to reads_path, notice:"削除しました" 30 end 31 32 def edit 33 @read = Read.find(params[:id]) 34 end 35 36 def update 37 @read = Read.find(params[:id]) 38 if @read.update(read_parameter) 39 redirect_to reads_path, notice: "編集しました" 40 else 41 render 'edit' 42 end 43 end 44 45 private 46 47 def read_parameter 48 params.require(:read).permit(:title, :content, :start_time) 49 end 50 51end 52

app/models/reads

ruby

1class Read < ApplicationRecord 2 belongs_to :user 3 4 validates :title, presence: true 5 validates :content, presence: true 6 validates :start_time , presence: true 7end 8

db/migrate/20231125061018_create_reads.rb

ruby

1class CreateReads < ActiveRecord::Migration[7.0] 2 def change 3 create_table :reads do |t| 4 t.string :title, null: false 5 t.text :content, null: false 6 t.datetime :start_time, null: false 7 t.references :user, null: false 8 9 10 t.timestamps 11 end 12 end 13end 14

スペルミスなどは確認しましたが、特に間違ってるところはないです。
すみませんがよろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

モデルのsaveメソッドは保存できたかどうかをtrue/falseで返すだけなので何かの問題があっても気付けない事が多いです。

更新系のメソッドはすべて半角ビックリマーク付きのメソッドを使うようにすると良いです。
例: update!、save!
このメソッドは保存に失敗すると例外が発生して画面にも詳細が出るし、エラーログにも内容が出力されるので原因の特定がしやすくなります。
一方でバリデーションのエラーの時は例外を出したくないはずなので、valid?を使ってsave!/update!の前にバリデーションエラーの有無を確認して入力画面を表示するか判定する必要はあります。

ruby

1 def create 2 @read = Read.new(read_parameter) 3 4 # バリデーションエラーがあれば入力画面を表示 5 unless @read.valid? 6 render :new 7 return 8 end 9 10  # save!で保存。何らかのエラーがあると例外が出る 11 @read.save! 12 redirect_to reads_path, notice: '投稿が保存されました' 13 end 14 15 def update 16 @read = Read.find(params[:id]) 17 @read.attributes = read_parameter 18 19 unless @read.valid? 20 render :edit 21 return 22 end 23 24 @read.update! 25 redirect_to reads_path, notice: "編集しました" 26 end

投稿2023/11/27 04:52

mingos

総合スコア4035

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

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

satoukouhei

2023/11/27 12:36

ありがとうございます!解決できました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.42%

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

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

質問する

関連した質問