memorandums

日々の生活で問題解決したこと、知ってよかったことなどを自分が思い出すために記録しています。

Railsでcheckboxを使ってみる(学校の宿題的な話)

授業で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なんとかという便利なヘルパーがあるようです。実用的にはそちらを使うのでしょうね。