ActiveHashはデータベースに保存する程でもない、決まったデータをモデルファイル内に保存してしまおうという大胆なRailsのGemです。
僕もなんでも酒屋でおなじみカクヤスのWEBアプリケーションでよくみる機能で、実際自分のオリジナルアプリに導入してみようという感じで鼻息が荒くなりました。
今回は間違えやすいViewの表示についてのアプトプットですが前置きが長い!
作業方法としては、まず主する、controllerやmodleなどなんやかんやを作ります
参考までに作ったなんやかんやです
コントローラーの記述!
class RoutinesController < ApplicationController
def new
@routine = Routine.new
end
def create
@routine = Routine.new(routine_params)
if @routine.save
redirect_to root_path
else
render :new
end
end
private
def routine_params
params.require(:routine).permit(:content,:calendar_id,:how_many)
end
end
母なるモデル!!
class Routine < ApplicationRecord
extend ActiveHash::Associations::ActiveRecordExtensions
belongs_to :calendar
validates :content, :how_many, presence: true
validates :calendar_id, numericality:{ other_than: 1 , message: "can't be blank" }
end
登録する為のView!!!
<div class="routines">
<h3>ルーティンワークを登録しよう</h3>
<div class="routines-new">
<%= form_with model: @routine, url:routines_path, local: true do |form| %>
<%= form.text_field :content, placeholder: "タイトル" ,class:"routines-title" %>
<%= form.collection_select(:calendar_id, Calendar.all, :id, :name, {},
{class:"calendar-select"} ) %>
<%= form.text_field :how_many, placeholder: "分量" ,class:"how-many"%>
<%= form.submit "登録" ,class:"routine-btn"%>
<% end %>
</div>
</div>
以上がなんやかんやです。
導入方法としてはまず
Gemをbudleinstallしちゃいます。
その後、上記のモデルをrails g model routineしちゃいます。
modelディレクトリ内にActiveHashの為のファイルを作成します。
したのがこんな感じ
class Calendar < ActiveHash::Base
self.data = [
{ id: 1, name: '---' },
{ id: 2, name: '月1回' },
{ id: 3, name: '月2回' },
{ id: 4, name: '月3回' },
{ id: 5, name: '週1回' },
{ id: 6, name: '週2回' },
{ id: 7, name: '週3回' },
{ id: 8, name: '週4回' },
{ id: 9, name: '週5回' },
{ id: 10, name: '毎日' },
]
include ActiveHash::Associations
has_many :routine
end
個人的に重要と感じたのはclassのCalender < ActiveHash::Baseという継承する為の
記述でした。アソシエーションの記述です。何回も使えるという点は良いのですが、id1、id2と記述するのは本当に骨が折れます。複雑骨折です。
これらを設定すれば利用できるのですが、あとはバリデーションとしてのnumericalityはとりあえず設定しておいた方が良いので設定しました。数値かどうかを検証するバリデーションの一種だそうです。
っとざっくり紹介しましたが
ここからが本題です。
個人的に分かりにくかったポイントですが保存したアクティブハッシュのデータをViewに表示させる為の記述です。
モデル名.calendar_idと記述してもid番号が表示されてしまいます。
その為正しく表示させるにはメインとなるモデル名.ハッシュのモデルファイル名.nameとなるとの事です。最初に記載した内容を元にした記述だと「routine.calendar.name」となります。
ここが意外と分かりにくかったです。
calendar_id.nameでもだめです。
.nameの部分はどうやら以下のnameがカラムのようになっていてというかカラムだと思うのですがカラム名を記述する事でその中の値が表示される仕組みのようです。
まあそりゃそうですよね。Rubyのハッシュを使った記述なんですから、一周回ってRubyの理解が深まった感じがしました。