授業でRailsの初歩(も)教えています。
これは授業資料の補足みたいなnoteです。実用ではありません。
できるだけタイプ数を少なくしてとりあえず動けばいいというレベルの話です。
Railsでcheckboxの使い方を説明していなかった。。。ここに書いておきます。
とりあえず、Railsで簡単なプロジェクトを作成します。
rails new AAA
で、コントローラとモデルを作ります。ついでにrails db:migrateします。
rails g controller books index new
rails g model book title:string, genre:string
rails db:migrate
routesを書きます。
Rails.application.routes.draw do
get 'books/index'
get 'books/new'
post 'books/create'
root 'books#index'
end
コントローラ(books_controller.rb)を編集します。チェックボックスで選択した複数の候補が配列に入っているのでjoinでCSV文字列に変換しDBに入れます。ちなみにstrong parameterは教えていません。なんかしらんけど入っちゃう。。。って楽だけど危ういな。。。と思うので面倒だけど明示的に書いてもらっています。
class BooksController < ApplicationController
def initialize
#ここがいいのかわからないけど、とりあえずコンストラクタでチェックボックスの選択肢をいれておきます。
@genre_list = ["技術", "産業", "芸術", "文学"]
end
def index
@books = Book.all
end
def new
@book = Book.new
end
def create
g = params[:book][:genre] || [""] #選択が空(nil)のときの対処
Book.create(title: params[:book][:title], genre: g.join(','))
redirect_to root_path
end
end
あとはビューを作ります。
まず、new.html.erb。check_boxの書き方がなかなか慣れが必要ですね。各パラメタの意味と効果を知らないと難しい。。。multipleを入れないと複数選択しても複数の項目を結果として出力してくれません。
<%= form_for @book, url: {action: :create} do |f| %>
<p>
タイトル:
<%= f.text_field :title %>
</p>
<p>
ジャンル:
<% @genre_list.each do |e| %>
<%= f.label :genre, e %>
<%= f.check_box :genre, {multiple: true}, e, nil %>
<% end %>
</p>
<%= f.submit %>
<% end %>
そして、index.html.erbです。一覧表示にもcheck_boxを使うのはどうかと思います(操作すると変えられる。。。)。ただDBは変わらないのでまぁよしかなという話です。
<% @books.each do |e| %>
<p>
タイトル:
<%= e.title %>
</p>
<p>
ジャンル:
<% @genre_list.each do |g| %>
<%=g%><%= check_box nil, nil, {checked: e.genre.split(',').include?(g)}, nil, nil %>
<% end %>
</p>
<% end %>
<%= link_to 'new book', books_new_path %>
とりあえず、それっぽく動くので。こういうの探して動かしてまとめるだけでも1時間くらいはかかってしまうので。。。collectionなんとかという便利なヘルパーがあるようです。実用的にはそちらを使うのでしょうね。