48
48

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

RailsでDBに関係ないクラスを作成したいんですが

Last updated at Posted at 2015-05-12

そもそもクラスとかモジュールって→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ヘルパーを徹底的に理解する


以上、指摘質問補足お待ちしています。

48
48
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
48
48

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?