ActiveHashで保存した内容をちゃんとViewするには?

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がカラムのようになっていてというかカラムだと思うのですがカラム名を記述する事でその中の値が表示される仕組みのようです。

{ id: 2, name: '月1回' },

 

まあそりゃそうですよね。Rubyのハッシュを使った記述なんですから、一周回ってRubyの理解が深まった感じがしました。