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

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

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

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

Q&A

解決済

1回答

806閲覧

rails todoアプリ作成 DBに登録されない

uooyr

総合スコア6

Ruby on Rails

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

0グッド

0クリップ

投稿2020/01/10 14:49

編集2020/01/11 06:32

railsでToDoアプリの作成をしているのですが
date型の日付と外部キーのカテゴリーがDBに登録されません。
他のフォームは登録されるのですが、この2つだけ未入力と判断されてしまします。
プログラミング初心者でどうすればいいかわかりません。

TasksController

1class TasksController < ApplicationController 2 before_action :set_task, only: [:show, :edit, :update, :destroy] 3 before_action :login_check, only: [:new, :edit, :update, :destroy, :index, :comp] 4 5 # GET /tasks 6 # GET /tasks.json 7 def index 8 @tasks = current_user.tasks.all 9 10 end 11 12 def comp 13 @tasks = current_user.tasks.all 14 end 15 16 17 # GET /tasks/new 18 def new 19 @task = Task.new 20 end 21 22 # POST /tasks 23 # POST /tasks.json 24def create 25 id = params[:id] 26 27 @task = Task.new(params[:task]) 28 @task.user = current_user 29 30 if @task.save 31 redirect_to '/tasks' , notice: 'タスクを作成しました' 32 else 33 render 'new' 34 end 35 end 36 37 private 38 def task_params 39 params.require(:task).permit( 40 :title, :status, :due_date, :category_id_id) 41 end 42

HTML

1<table calss="attr"> 2<%= form_for(@task) do |form| %> 3<tr> 4 <th><%= form.label :title, "タイトル" %></th> 5 <td><%= form.text_field :title, id: :title %></td> 6</tr> 7<tr> 8 <th><%= form.label :category_id_id, "カテゴリー" %></th> 9 <td><%= form.collection_select :category_id_id, Category.all, :id, :category%></td> 10</tr> 11<tr> 12 <th><%= form.label :status, "状況" %></th> 13 <td><%= form.select :status, Task.statuses.keys,:selected=>Task.statuses[@task.status] %><td> 14</tr> 15<tr> 16 <th><%= form.label :due_date, "期限" %></th> 17 <td><%= form.date_field :due_date %></td> 18</tr> 19<%= form.hidden_field :user_id, value: current_user.id %> 20 21 22</table> 23<%= form.submit "登録"%><br> 24<%= link_to '戻る', tasks_path %> 25 26<% end %>

tasksMigration

1class CreateTasks < ActiveRecord::Migration[5.2] 2 def change 3 create_table :tasks do |t| 4 t.references :category_id, foreign_key: true 5 t.references :user, foreign_key: true 6 t.string :title 7 t.date :due_date 8 t.integer :status, default: 0 9 10 11 end 12 end 13end

categoriesMigration

1class CreateCategories < ActiveRecord::Migration[5.2] 2 def change 3 create_table :categories do |t| 4 t.string :category 5 t.timestamps 6 end 7 end 8end

taskmodel

1class Task < ApplicationRecord 2 belongs_to :category, required: false 3 belongs_to :user 4 5 enum status:[:未完了, :完了] 6 7 validates :title, presence: true 8 validates :category_id_id, presence: true 9 validates :status, presence: true 10 validates :due_date, presence: true 11end 12

categorymodel

1class Category < ApplicationRecord 2 has_many :tasks 3end

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

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

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

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

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

guest

回答1

0

ベストアンサー

Taskにあるcolumnはcategory_id であって category ではないですので、
form.collection_select :category, と permit(:due_date,:category) は両方共 category_id にしてください。

必須のcategory_idがなかったため、validationに引っかかり登録できなかったのだと思われます。

class 定義では belongs_to :category, required: false になっているので、railsは通してくれますが、table定義が t.references :category_id, foreign_key: true なのでこちらではねられます。

投稿2020/01/11 02:44

winterboum

総合スコア23347

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

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

uooyr

2020/01/11 06:30

form.collection_select :category, と permit(:due_date,:category) をcategory_idにすると、 ------------------------------------------------------------ ActionView::Template::Error (undefined method `category_id' for #<Task:0x000000000be2a440> Did you mean? category_id_id category category=): ------------------------------------------------------------ というエラーが出ためcategory_id_idという名前にしたら、バリデーションは抜けられたんですが ------------------------------------------------------------ ActiveRecord::StatementInvalid (SQLite3::SQLException: no such table: main.category_ids: INSERT INTO "tasks" ("category_id_id", "user_id", "title", "due_date") VALUES (?, ?, ?, ?)): ------------------------------------------------------------ というエラーが出るようになってしまいました。 フォームで送信してあるはずのstausとpkのidが入っていないのが謎です。 DBはSQLite3を使用していてtasksテーブルは作成済みです。
uooyr

2020/01/11 06:33

コードの編集行いました。
winterboum

2020/01/11 08:49 編集

あ! class CreateTasks に間違いが t.references :category_id, foreign_key: true ではなく t.references :category, foreign_key: true です それで category_id_id を category_id に戻してください
uooyr

2020/01/11 14:50

DBに登録することができました! 一覧を表示するページにカテゴリーを表示しようとすると ------------------------------ #<Category:0x00000000075f6200> ------------------------------ というように表示されてしまうのですが、これを解決するにはどうすればいいのでしょうか...
winterboum

2020/01/11 21:20

Categoryの何を表示させたいのでしょう。 category.表示させたいもの としてください
uooyr

2020/01/12 15:51

出来ました... ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問