質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

1回答

324閲覧

Rails 5.2.4.3でAjaxの実装ができない。

Tomato_leaf

総合スコア173

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2020/06/09 07:12

編集2020/06/10 03:30

下記を参考に
http://song-of-life.hatenablog.com/entry/2017/09/30/234356
https://kurose.me/form_for_ajax/
https://qiita.com/rio_threehouse/items/b067d64eafdfbd25b91d

Rails 5.2.4.3でのAjaxの実装を試みていますが
ログをみるとHTMLになっており反応していなさそうです。
どの記事をみても、
まずはform_withなどにremote: true を加える必要があるそうなのですが
動きません。動かないというよりはボタンをクリックしても
HTML遷移してしまいます。
これはどのようなことが原因と考えられるでしょうか?

raisls

1<div id="samplRemote"> 2<%= form_with(model: @hashtag, url: users_path, method: :get, local: true, remote: true) do |f| %> 3 <%= f.submit 'RandomTag', class: 'btn btn-primary btn-sm' %> 4 <!--<div>--> 5 <button class="clipboard-btn" data-clipboard-action="copy" data-clipboard-target="#bar"> 6 Copy 7 </button> 8 <!--</div>--> 9 10 <%= f.label :"Set Number" %> 11 <%= f.select :hashtags, 1.upto(30).map{|i| [i, i]}, class:"form-control" %><br> 12<% end %>

追記
ありがとうございます。
確かにlocal: trueを削除するとJSに切り替わったようです。
ですがボタンクリックしても作動しません。
これはコントローラー側のコードが悪いのでしょうか?
ここを参考にしながら書きました。
https://www.sejuku.net/blog/28967
http://song-of-life.hatenablog.com/entry/2017/09/30/234356

コントローラー
users_controller.rb

Rails

1class UsersController < ApplicationController 2 before_action :require_user_logged_in, only: [:index, :show] 3 4 def index 5 if logged_in? 6 @hashtag = current_user.hashtags.build # form_with 用 7 @hashtags = current_user.hashtags.order(id: :desc).page(params[:page]) 8 if params[:hashtag].nil? 9 @randomtags = Hashtag.order("RAND()").limit(28) 10 # Ajax 11 respond_to do |format| 12 format.html 13 format.js 14 end 15 # Ajax 16 else 17 @randomtags = Hashtag.order("RAND()").limit(params[:hashtag][:hashtags]) 18 # Ajax 19 respond_to do |format| 20 format.html 21 format.js 22 end 23 # Ajax 24 end 25 end 26 end 27 28 def show 29 end 30 31 def new 32 @user = User.new 33 end 34 35 def create 36 @user = User.new(user_params) 37 38 if @user.save 39 flash[:success] = 'ユーザを登録しました。' 40 redirect_to @user 41 else 42 flash.now[:danger] = 'ユーザの登録に失敗しました。' 43 render :new 44 end 45 end 46 47 def edit 48 @user = User.find(params[:id]) 49 end 50 51 def update 52 @user = User.find(params[:id]) 53 if @user.update_attributes(user_params) 54 flash[:success] = "Profile updated" 55 redirect_to @user 56 else 57 render 'edit' 58 end 59 end 60 61 private 62 63 def user_params 64 params.require(:user).permit(:name, :email, :password, :password_confirmation) 65 end 66end

ビューファイルです。
パーシャルへレンダーしています。
index.js.erb

$('#samplRemote').html("<%= escape_javascript(render 'randomtags') %>");

index.html.erb

<div id="samplRemote"> <%= form_with(model: @hashtag, url: users_path, method: :get, remote: true) do |f| %> <%= f.submit 'RandomTag', class: 'btn1 btn-primary btn-sm' %> <!--<div>--> <button class="clipboard-btn btn1 btn-primary btn-sm" data-clipboard-action="copy" data-clipboard-target="#bar"> Copy </button> <!--</div>--> <div class = "setnumber"> <%= f.label :"Set Number" %> </div> <%= f.select :hashtags, 1.upto(30).map{|i| [i, i]}, class:"form-control" %><br> <% end %> <!-- Target --> <div class="box2" id="bar"> <p><%= render 'randomtags/randomtags', randomtags: @randomtags %></p> </div> <!-- Trigger --> <div class="mytags"> <div class="mytag"> <h3>My Tag</h3> </div> <div class="mytag"> <%= form_with(model: @hashtag, remote: true) do |f| %> <div class = "addtag"> <%= f.submit 'Add Tag'%> </div> <!--<div class="form-group">--> <div class = "textarea"> <%= f.text_area :content, rows: 1 %> </div> <!--</div>--> <% end %> </div> </div> <div class="box3"> <%= render 'hashtags/hashtags', hashtags: @hashtags %> </div> </div>

パーシャル
_randomtags.html

_randomtags.html.erb

1<% @randomtags.each do |randomtag| %> 2 <div class = "r"> 3 <span>#<%= randomtag.content %></span> 4 </div> 5<% end %>

ルーティング
routes.rb

Rails.application.routes.draw do get 'hashtags/create' get 'hashtags/destroy' get 'sessions/new' get 'sessions/create' get 'sessions/destroy' get 'hashtags/index' post 'hashtags/index' root to: 'toppages#index' get 'login', to: 'sessions#new' post 'login', to: 'sessions#create' delete 'logout', to: 'sessions#destroy' get 'signup', to: 'users#new' resources :users, only: [:index, :show, :new, :create, :edit, :update] resources :hashtags, only: [:create, :destroy, :show] end

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

local:trueは削除してください。remote:trueで、「post側」は、ajax通信が行えるようになっています。

その後のHTML遷移は、controller側での設定となりますので、そちらを見直す必要があります。

以前、Turbolinksも含めて整理したものです。
わかりにくいと思いますが…参考になれば幸いです。
https://teratail.com/questions/238976#reply-352560

投稿2020/06/09 08:00

no1knows

総合スコア3365

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Tomato_leaf

2020/06/09 13:21

ありがとうございます。確かにlocal: trueを削除するとJSに切り替わったようです。ですがまだ作動しないようです。おそらく私のコントローラー側の記載がおかしいのかもしれません。一度お時間ある時にでも追記分をご覧いただけますと幸いです。
no1knows

2020/06/09 13:41

indexアクションにformat.jsを記載するのではなく、createか、updateに記載する形になるかと思います。 僕が知っている中で一番わかりやすいのは下記コードです。 scaffoldを利用してさくっと作ってみると理解しやすいと思います。 https://railsguides.jp/working_with_javascript_in_rails.html#%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E5%81%B4%E3%81%A7%E8%80%83%E6%85%AE%E3%81%99%E3%81%B9%E3%81%8D%E7%82%B9 また関係ないところだと<%= form_with(model: @hashtag, url: users_path, method: :get, remote: true) do |f| %>のmethodですが、getで良かったんでしたっけ? データを投げるからpostになるような気がしますが・・・間違っていたらすいません。 参考までにform_withは、デフォルトがremote:trueになっていたはずです。なので記載する必要はないですが、明示的に利用するのは良い方法だと思います。
Tomato_leaf

2020/06/09 15:06

ありがとうございます。 じつは下記のようなアプリを作っています。 https://i.gyazo.com/23263dca7fe66cd17569b12a875feb51.png RANDOMTAGのボタンを押すとハッシュタグがランダムで選び出されるというアプリです。 なのでPostというよりはGetで、しかもその一覧はIndexコントローラーによって表示されています。 ログインに成功していたらHashTagがランダムで表示されるといった感じですね。 なお、CreateとUpdateに関しては ログイン機能とユーザー情報アップデートの関する記載をしているので 記載の場所としては今回は違うような気がしています。
no1knows

2020/06/09 15:44

なるほど、了解です。 これまでご提示いただいた各ファイル名を追記いただけますか? またパーシャルでよびだしているrandomtagsとrandomtags/randomtagsも記載ください。
Tomato_leaf

2020/06/10 03:31

ありがとうございます。追記させていただきました。もし、なにか足りない情報などありましたら、教えてください。よろしくお願いいたします。
no1knows

2020/06/10 12:12

index.js.erbから読み取ると動きとしては、ボタンを押すと画面上部のボタンなどが全て消えて、<div id="samplRemote">の中にrandomtags.htmlだけが表示される形だと思うのですが。 どうすれば非同期でデータの取得ができるのか、僕には力不足でよくわかりませんでした。 申し訳ないです。 お時間があるようでしたら、上記でご案内したRailsガイドのサンプルに沿って、ご自身のコードを設定いただくのが近道な気がします。
no1knows

2020/06/19 07:34

とりあえず解決したようでなによりです。 ただしAjaxを実装するのにclipboard-railsを利用するというのは適切なアプローチではないはずです。 もし転職などを考えてのポートフォリオであれば上記に示したような適切な実装にしておいたほうが良いかと思います。
Tomato_leaf

2020/06/19 07:41

そうなんですね。。ありがとうございます。もう一度調べてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問