そもそもクラスとかモジュールって→rubyのclass/moduleをはっきり理解していないRails人へ
処理系はlib/以下に書く
dbには保存しないが特定の対象に処理をしたいっていうときに、app/model
にActiveRecordクラス作るのも無駄だなっていうときは、lib/
以下にrubyの普通のclass or moduleを書いちゃいましょう。
アプリケーション起動時に自動でclass読み込む
rails内でActiveRecordのクラスがいつもどこからでも自由に使えちゃうのは、railsがそれらを最初に読み込んどいてくれるからですね。railsさすが。
lib/
以下に他で使うclassかmodule書きたい!ってときは、lib以下も自動で読み込むようにしましょう。
自動読み込みのpathを追加
railsが自動読み込みする際にみるのがconfig/application.rb
です。なので、そこで、以下の行を追加してあげましょう。
config.autoload_paths += %W(#{config.root}/lib #{config.root}/lib)
すると、libディレクトリ以下が自動で読み込まれるようになります。
ActiveModelのrailsの便利な特性を利用するclass作成
dbに存在するrecordじゃないんだけど...form_forの恩恵を授かりたい。
見てわかる通り、hashしたparamsを作成する点で、form_forは圧倒的にコードの繰り返し少なく楽に書くことができる。model objectのインスタンスを渡してform_forは使うので、recordじゃなければ無理なんじゃ...?と思いきや、方法ありました。dbになくとも、modelクラスを作成して、ActiveModelをincludeすればいけます。(ActiveModelはActiveRecordからdbにアクセスする機能を引いたmoduleと理解してくだせ。)
class User
include ActiveModel::Model
attr_accessor :name
validates :name, presence: true
#この辺にいつも通りmethodもかける。
end
のように、userがdbに保存される系のオブジェクトじゃないときも、ActiveModel::Modelをincludeして、controllerから
@user=user.new
でインスタンス渡してやれば、いつも通り、form_forを使うことができます。その際、form_forでuserに渡すattributesに関しては、attr_accessorで宣言しておきましょう。上で紹介したように、text_filed軍団は、model objectのattributesでないものをparams[:model名][:ここ]に入れてくれないので。attributesでないといけないというわけではなくて、@object.attr_nameの形でアクセスできればいいので、理屈的にはmethodでもなんでもobjectからこの形でアクセスされるものが定義されていて、@object.attr_nameがエラーを返さなきゃそれで良さげである。
詳しくはこちら→【Rails】formヘルパーを徹底的に理解する
以上、指摘質問補足お待ちしています。