はじめに
初学者がポートフォリオ作成でハマったことをメモします。
TiwtterのアカウントIDのように特定のカラムの最初に@を付ける方法です。ホートフォリオ作成時にユーザーの名前やアカウントIDの最初に@を付けたいという方は多いと思います。
初歩的な内容すぎて調べてもそのような記事がすぐ見つからなかったので残しておきます。
結論
before_save
をmodelに設定する。
上記の方法ではログイン、ログアウトの際もbefore_saveが実行されてしまいログインする度に@が増えてしまう為他の方法で実装した。(特定のコントローラーでのみbefore_saveを実行する方法がわからなかった。)
コードと説明
今回Userモデルのaccount_nameカラムに@を付けたい
def create
@user = User.new(user_params)
@user.account_name = "@" + @user.account_name #ここで@を付ける
if @user.save
@user.send_activation_email
flash[:info] = "メールを確認してアカウントを有効化して下さい"
redirect_to root_url
else
render "new"
end
end
def update
@user = User.find(params[:id])
if @user.update_attributes(user_params)
@user.account_name = "@" + @user.account_name
@user.save
flash[:success] = "プロフィールを編集しました"
redirect_to @user
else
render 'edit'
end
end
def edit
@user = User.find(params[:id])
@account_name = @user.account_name
@account_name.slice!(0)
@account_name
end
= form_with model:@user, local:true do |f|
= f.label :account_name, 'アカウントID'
.input-group
.input-group-prepend
.input-group-text @
= f.text_field :account_name, class: 'form-control' , placeholder: "9文字まで", value: @account_name
formから送られてきた値を保存する前に加工する。
またプロフィール編集ページでフォームに初期値をセットする際、@を除いた値を入れる必要がある。
そこでコントローラーのeditアクション内でsliceメソッドを使用して@を削除した。
その変数をformのvalue属性で初期値としてセットした。
sliceメソッドについて
http://doc.code161.com/ruby/string-delete-method/
参考までにnewテンプレートのコードです。
# slim,bootstrap使用
= form_with model: @user, local: true do |f|
(中略)
= f.label :account_name, 'アカウントID'
.input-group
.input-group-prepend
.input-group-text @
= f.text_field :account_name, class: 'form-control' , placeholder: "9文字まで"

終わりに
誰かのお役に立てれば幸いです。
もっとスマートなやり方があれば教えてください。
また間違えている部分があればコメントお願い致します。
参考にした記事
https://qiita.com/KeisukeYoshida0220/items/e1ce152ac8d89845aab3