はじめに
rails初心者が検索機能の実装に挑戦しました。
個人的な記録なので、あくまでに参考にする程度でお願いいたします。
環境は以下です。
mac
ruby 3.1.2p20 (2022-04-12 revision 4491bb740a) [x86_64-darwin22]
Rails 7.0.4.3
[参考にさせていただいたもの]"https://abillyz.com/moco/studies/649")
アプリの作成
ターミナル
rails new To_do
--To_doアプリが作成されたら--
cd To_do
--上記のコマンドでTo_doディレクトリに移動--
scaffoldでtitleとcontent,starttime,endtime及びlimeを作成
カラムには、更なるバージョンアップのため、同時に日付を作成しておりますが、その検索はここではできません。
ターミナル
rails generate scaffold Task title:string content:string starttime:datetime endtime:datetime limit:datetime
下記を確認
ターミナル
--テーブルとカラムを作成するファイルの生成を確認--
ls -1FA db/migrate
20○-----------○_create_tasks.rb
--以下で上記ファイルの中身を確認--
nano db/migrate/20○-----------○_create_tasks.rb
ターミナルに表示された中身
class CreateTasks < ActiveRecord::Migration[7.0]
def change
create_table :tasks do |t|
t.string :title
t.string :content
t.datetime :starttime
t.datetime :endtime
t.datetime :limit
t.timestamps
end
end
end
--支障なしの場合、Cnt + x の次に n
変更がある場合については調査中--
seedデータ作成準備と検索機能実装の準備
Gemfile(拡張子の記載なし)に以下を追加する。
Gemfileの中身
--faker を利用ため、Gemfile の最後に以下を追記--
gem 'faker'
gem'ransack'
--2段目の'ransack'は、検索用のものをついでに追加--
ターミナル
bundle install
seedデータの作成
db/seeds.rbに以下を書き込む
seed.rbの中身
20.times do |n|
Task.create!(
title: Faker::Book.title,
content: Faker::Name.name,
starttime: "Thu, 04 May 2023 20:18:00 JST +09:00",
endtime: "Thu, 04 May 2023 20:18:00 JST +09:00",
limit: "Thu, 04 May 2023 20:18:00 JST +09:00"
)
end
データベース、テーブル及びseedデータの作成
ターミナル
rails db:create
rails db:migrate
rails db:seed
--seedデータの作成は成功の表示がないので以下で確認--
rails s
--一覧表示があれば成功している--
--上手くいかない場合、最初にrails db:dropを実施--
コントローラの実装
app/controller/tasks_controller.rbのdef indexの中身を変更する。
tasks_controller.rb
def index
@q = Task.ransack(params[:q])
@tasks = @q.result
end
ビューの実装
app/views/tasks/index
index.html.rb
<h1>Tasks</h1>
--間に挿入--
<%= search_form_for @q do |f| %>
<%= f.label :title_cont, 'title' %>
<%= f.search_field :title_cont %>
<%= f.label :content, '内容' %>
<%= f.search_field :content_cont %>
<%= f.submit %>
<% end %>
<%= link_to '一覧を出す', tasks_path %>
--間に挿入--
<div id="tasks">
modlesの実装
app/modeles/task.rbの中身
task.rb
class Task < ApplicationRecord
def self.ransackable_associations(auth_object = nil)
['title', 'content']
end
def self.ransackable_attributes(auth_object = nil)
['title', 'content']
end
end
動作の確認
ターミナル
rails s
--新規作成や検索が動くことを確認--
最後に
railsに独学で挑戦して、半年、いつまで経っても、初心者の高齢者が悪戦苦闘して、なんとかできたものの記録です。
どなたかのお役に立てれば幸いです。
ps datetimeは非推奨となっているらしいので、複雑な操作を追加する場合は留意が必要なようです。