# Rails Formオブジェクトの紹介 ## 使いどころ 複数のテーブルに登録するフォームを実装するときなど コントローラが肥大化するのを防ぐ ## UniqueFreeAnswerモデル | カラム名 | 型 | | - | - | | id | int | | 自由回答本文(value) | string | | 設問ID (q_id) | int | ## FreeAnswerモデル | FreeAnswer | | | - | - | | id | int | unique_free_answer_ID | int | | 回答者ID (respondent_id) | int | ## 仕様 q_id, respondent_id, 自由回答本文(values)をPOSTしてFreeAnswerのレコードを登録する。 ただし、送信したvalueがUniqueFreeAnswerテーブルに存在しない場合は、まずUniueqFreeAnswerのレコードを登録したあとにFreeAnswerのレコードを登録する。 ## Formオブジェクトを使わない場合の実装 ### パラメータ ```rb :q_id, :respondent_id, values: [] ``` ### FreeAnswerController ```rb def create response = [] ActiveRecord::Base.transaction do params[:values].each do |value| uniq_fa = UniqueFreeAnswer.find_or_create_by( value: value, question_id: params[:q_id] ) fa = FreeAnswer.find_or_create_by!( unique_free_answer: uniq_fa, respondent_id: params[:respondent_id] ) response.append({fa: fa, uniq_fa: uniq_fa}) end end render status: 200, json: { data: response } end ``` スキニーコントローラ、ファットモデルとするのがMVCモデルのデザインパターン コントローラがファットになるのはアンチパターン ## Formオブジェクトを使うと… コントローラに書いていたロジックをフォームモデルに分離できる コントローラがすっきりする
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up