はじめに
Rubyを勉強し始めたときに必ず出てくる attr_accsessor
しかしRailsを勉強し始めて、ポートフォリオ等を作る過程では、中々触れる機会が減ると思います。
この記事で触れない部分
-
attr_accsessor
の細かい説明 - rubyの基礎基礎的な部分
- railsの基礎的な部分
attr_accsessor
が有効活用できる場面
- Userモデル
id | name |
---|---|
1 | ユーザーA |
2 | ユーザーB |
以下のような要件を想定
Userモデルの中に、ユーザーの名前情報を格納するname
という属性が定義されている
しかしユーザー情報の登録・編集フォームでは、名字と名前を別々のテキストフィールドから入力させたい。
上記のユースケースの場合、attr_accsessor
が活躍する場面です。
name
カラム塗とは別に、今回は fisrt_name
と last_name
という擬似的なフィールドを定義してあげましょう。
実装
モデル
以下を定義したことで、Userモデルのインスタンスを作成すると、fisrt_name
とlast_name
のゲッターとセッターが使えるようになりました。
class User < ApplicationRecord
attr_accsessor :fisrt_name, :last_name
end
ビューとコントローラ側でも fisrt_name
とlast_name
が使えるようにしましょう。
コントローラ
class UsersController < ApplicationController
def new
@user = User.new
end
def create
user = User.new(user_params)
user.save
end
private
def user_params
params.require(:user).permit(:first_name, :last_name)
end
end
コントローラ側ではstrong parameterに設定してあげます。
ビュー
<%= form_with model: @user, local: true, url: url, method: method do |f| %>
<!-- 姓 -->
<%= f.label :last_name %>
<%= f.text_field :last_name %>
<!-- 名 -->
<%= f.label :first_name %>
<%= f.text_field :first_name %>
<%= f.submit "送信" %>
<% end %>
ビューではそのままtext_feild
のname属性にlast_name
と first_name
を指定します
ここまでで下準備は出来ました。
ただ現状では、last_name
と first_name
のパラメータをフォームから送信する事は出来ても、受け取り側が不十分です。
具体的には、実際にDBに登録されるのは name
という属性です。
last_name
と first_name
はDBとモデルには定義されていないので登録時にはそのまま使う事が出来ません。
そこでモデル側に、コントローラ側で受け取ったlast_name
と first_name
をname
に結合してあげる処理を実装します。
class User < ApplicationRecord
attr_accsessor :fisrt_name, :last_name
# 以下追加分
# 登録処理の前に呼び出す
before_save :create_fullname
# last_name と first_nameの結合処理
def create_fullname
self.name = self.last_name.concat(" ",self.first_name)
end
end
コールバックで、user.save
の直前に create_fullname
を呼び出します。
ちなみに concat(" ",self.first_name)
で半角スペースを入れているのは、編集時のデリミタを指定できるようにするためです。
そのまま結合をしてしまうと、name
編集時にどこで文字列を分割するかが分からなくなるからです。
まとめ
attr_accsessor
を使うユースケースよりの記事になってしまいましたが、やhりRubyの基礎を理解しておくことでアプリケーションの要件が複雑化した際の対応力が圧倒的に変わります。
Railsは便利なフレームワーク故に、ついRubyの基礎を忘れてしまいがちです。
自分も今一度基礎を見直して日々精進します