前提・実現したいこと
Ruby 2.4.5
Rails 4.2.8
本番環境:heroku postgreSQL
開発環境:mySQL
ユーザーが設定画面でオリジナルのfriendly_url(Twitterの@以下のような一意制約)を設定した時に、すでに取得済みの場合、アラートを出す処理を実装しています。
Ajaxで入力値をPOSTし、その値がすでに DBにあるかどうかで条件分岐しています。
コントローラーでのJSONの処理などがうまくできておらず、困っております。
- users/edit.html.erbでユーザーが入力
- AjaxでPOST送信
- Userコントローラーのcheckアクションに飛ぶ
- checkアクションでDB検索、ここでjsonを返す
friendly_urlは、userテーブルの1カラムとして存在しています。
そのため、userモデルを通じてDB検索をしています。
該当のソースコード
users/edit.html.erb
javascript
1 2//フォーム該当部 3<li> URL (3~20文字英数字)<%= f.text_field :friendly_url,:required => true %></li> 4 5// friendly_urlのバリデーションチェック 6$(function(){ 7 $('#user_friendly_url').on('blur',function(){ 8 $(this).next('span.error').remove(); 9 $(this).removeClass('input_error'); 10 let f_url = $(this).val(); 11 if(f_url == ""){ 12 $(this).addClass('input_error'); 13 $(this).after('<span class="error">必ず入力してください</span>'); 14 $(this).focus(); 15 return; 16 } 17//ここまでは問題なさそう。以下が問題あり。 18 $.ajax({ 19 type:'POST', 20 url:'/users/check', //ここのurlはコントローラーに飛ばすため? 21 data:{url:f_url}, 22 dataType:'json', 23 }).done(function(data, status, xhr) { 24 if(status === "success"){ 25 if(data.isduplicated){ 26 $('#user_friendly_url').addClass('input_error'); 27 $('#user_friendly_url').after('<span class="error">既に利用されています</span>'); 28 $('#user_friendly_url').focus(); 29 } 30 } 31 }).fail(function(xhr, status, error) { 32 console.log(xhr); 33 }); 34 }); 35 }); 36
Routes.rb
ruby
1post '/users/check' => 'users#check' 2#このルーティングは必要?
user_controller
ruby
1 def check 2 @users = User.where('friendly_url LIKE(?)', "#{params[:url]}") 3 #paramsとして送られてきたurlで、Userモデルのfriendly_urlカラムを検索し、その結果をどうすればいい...? 4 respond_to do |format| 5 format.json { render 'edit', json: @users } 6 #json形式のデータを受け取ったら、@usersをデータとして返す? 7 end 8 end
DB検索して、DBに存在するかどうかを調べるので@usersは返す必要がないと思いますが、ここをどうすればいいのかわからずにいます。
試したこと
補足情報(FW/ツールのバージョンなど)
こちらでの質問内容に関連しています。
以前の質問
--5月3日 補足--
以下のようにUserコントローラーを編集し、ユーザー入力値でDB検索したとき、friendly_urlが存在する場合は、「isdupricated_true」存在しない場合は「isdupricated_false」がコンソール上で出力されているのが確認できました。
しかしやりたいことは、isdupricatedというキーにtrueとfalseを設定して返すことなので、これでは不十分です。
いくつか回答いただいたなかでモジュール変換というのがこれに当たるのでしょうか...。
かなり調べてみたのですが、format.json
の1行に関して参考にできるものが見つからず。。。
user_controller
ruby
1 def check 2 if User.where('friendly_url LIKE(?)', "#{params[:url]}").exists? 3 #paramsとして送られてきたurlで、Userモデルのfriendly_urlカラムを検索し場合分け 4 respond_to do |format| 5 format.json { render :json => :isdupricated_true} #存在する場合 6 #format.json { render :json => :isdupricated :true } エラー 7 #format.json { render :json => (:isdupricated :true) } エラー 8 end 9 else 10 respond_to do |format| 11 format.json { render :json => :isdupricated_false } #存在しない場合 12 end 13 end 14 end
回答3件
あなたの回答
tips
プレビュー