LoginSignup
0
0

More than 3 years have passed since last update.

【rails】ユーザー 登録時にnameカラムに自動的に@を付ける方法

Last updated at Posted at 2020-01-23

はじめに

初学者がポートフォリオ作成でハマったことをメモします。
TiwtterのアカウントIDのように特定のカラムの最初に@を付ける方法です。ホートフォリオ作成時にユーザーの名前やアカウントIDの最初に@を付けたいという方は多いと思います。
初歩的な内容すぎて調べてもそのような記事がすぐ見つからなかったので残しておきます。

結論

before_saveをmodelに設定する。

上記の方法ではログイン、ログアウトの際もbefore_saveが実行されてしまいログインする度に@が増えてしまう為他の方法で実装した。(特定のコントローラーでのみbefore_saveを実行する方法がわからなかった。)

コードと説明

今回Userモデルのaccount_nameカラムに@を付けたい

controllers/users_controller.rb
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
views/users/edit.html.slim
= 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属性で初期値としてセットした。

コールバック処理について
http://www.techscore.com/blog/2012/12/25/rails%E3%81%AE%E3%82%B3%E3%83%BC%E3%83%AB%E3%83%90%E3%83%83%E3%82%AF%E3%81%BE%E3%81%A8%E3%82%81/

sliceメソッドについて
http://doc.code161.com/ruby/string-delete-method/



参考までにnewテンプレートのコードです。

views/users/new.html.slim
#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文字まで" 

スクリーンショット 2020-01-23 18.52.24.png

終わりに

誰かのお役に立てれば幸いです。
もっとスマートなやり方があれば教えてください。
また間違えている部分があればコメントお願い致します。

参考にした記事
https://qiita.com/KeisukeYoshida0220/items/e1ce152ac8d89845aab3

0
0
0

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
0
0