前提・実現したいこと
Ruby 2.4.5
Rails 4.2.8
本番環境:heroku postgreSQL
開発環境:mySQL
ユーザーがユーザ情報編集のためフォームを入力後、送信するも、バリデーションに引っかかってエラー画面に移る。
しかし、もう一度ユーザー編集画面に戻ると、バリデーションをかけているはずなのに登録できてしまっている。
上記が現状発生している問題です。
以下フロー
- users/edit.html.erbでユーザーが情報を編集(friendly_id(ユーザーがURLを決定できるGem)を編集し英数字で文字列を決定)
2. ユーザーが英数字ではなく、ひらがな(例:あいうえお)を入力し送信
3. エラー画面に遷移
4 送信したひらがなをfriendly_idに当てはめて(例:http://localhost:3000/users/あいうえお)アクセスすると、アクセスできてしまう。(つまりひらがな「あいうえお」がfriendly_idにupdateされている)
発生している問題・エラーメッセージ
ローカル環境では、This page isn’t working
というエラー
Herokuでは、Application error An error occurred in the application and your page could not be served. If you are the application owner, check your logs for details. You can do this from the Heroku CLI with the command
というエラー
該当のソースコード
ユーザ情報編集画面
users/edit.html.erb
erb
1<%= form_for @user do |f| %> 2 <div class="modal-body"> 3 <div class="error-message"></div> 4 <label> 5 <span class="btn">アイコン画像 6 <%= f.file_field :avatar ,:style=>"display:none;" , id: 'avatar_img' %> 7 </span> 8 <div class="image-edit"> 9 <img id="avatar_img_prev" src="#" class='hidden' /> 10 <%= image_tag(@user.avatar(:medium), :size => "70x70", :class => " avatar_present_img") %> 11 </div> 12 </label> 13 <ul style="list-style: none; padding-left: 0;"> 14 <li><i class="fa fa-user"></i> ユーザー名<%= f.text_field :nickname, placeholder: "ニックネーム", :required => true %></li> 15 <li><i class="fa fa-link"></i> URL (3~20文字英数字)<%= f.text_field :friendly_url, placeholder: "URLを設定(英数字3-20文字)" , :required => true %></li> 16 <li><i class="fa fa-twitter"></i> Twitter<%= f.text_field :twitter, placeholder: "@以下だけを入力" %></li> 17 <li><i class="fa fa-instagram"></i> Instagram<%= f.text_field :instagram, placeholder: "@以下だけを入力" %></li> 18 <li><i class="fa fa-comment"></i> プロフィール<%= f.text_area :description, placeholder: "100文字以内で入力" %></li> 19 </ul> 20 </div> 21 <div class="modal-footer"> 22 <%= f.submit "完了", class: "btn" %> 23 </div> 24<% end %>
ユーザーモデル
バリデーションの設定で、英数字のみに限定
user.rb
ruby
1#friendly_url 2 include FriendlyId 3 friendly_id :friendly_url 4 5 validates :friendly_url, length: { in: 3..20 }, 6 uniqueness: true, #一意性 7 format: { with: /\A[\w@-]*[A-Za-z][\w@-]*\z/ }, #英数字のみ 8 on: :friendly_url_user #登録時に入力必要なし
friendly_idに関するmigrationファイル
ruby
1class AddFriendlyUrlToUsers < ActiveRecord::Migration 2 def change 3 add_column :users, :friendly_url, :string 4 5 add_index :users, :friendly_url, :unique => true 6 end 7end
コントローラー該当部
user_controller.rb
ruby
1def update 2 @user = User.friendly.find(params[:id]) 3 @user.update(update_params) 4 if @user.valid? 5 flash[:notice] = "更新しました" 6 if @user.friendly_url 7 redirect_to "/#{@user.friendly_url}" 8 else 9 redirect_to :user and return 10 end 11 else 12 if @user.friendly_url? 13 render :error 14 else 15 render :error 16 end 17 end 18 end 19 20 private 21 22 def update_params 23 params.require(:user).permit(:nickname, :password, :password_confirmation, :current_password, :avatar, :description, :twitter, :instagram, :friendly_url) 24 end 25 26 def correct_user 27 user = User.friendly.find(params[:id]) 28 if current_user != user 29 redirect_to root_path 30 end 31 end
試したこと
実際に、データベースに保存されてしまっているため、モデルのみだけではなくデータベースにもバリデーションをかけるのが必要なのでは...?と考えています。
しかし、送信後Railsのエラー画面になるのではなく、エラーメッセージを表示するもしくは、指定したページに飛ばすようにしたいと考えています。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/04/20 00:51
2019/04/20 01:38
2019/04/23 06:18