🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby on Rails 6

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

Ruby on Rails

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

ルーティング

ルーティングとは、TCP/IPネットワークにおいて、目的のホストまでパケットを送る為のパス選定のプロセスを言います。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

Q&A

解決済

1回答

1565閲覧

ajaxを使ったupdateでルーティングエラー

pecchan

総合スコア591

Ruby on Rails 6

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

Ruby on Rails

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

ルーティング

ルーティングとは、TCP/IPネットワークにおいて、目的のホストまでパケットを送る為のパス選定のプロセスを言います。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

0グッド

0クリップ

投稿2021/03/31 06:56

編集2021/03/31 23:25

rails6.1
初歩的な質問恐れ入ります。

ajaxでupdateを試みたのですがルーティングエラーが発生します。
ルーティングなど見直しましたが分かりません。

\config\routes.rb

ruby

1 resources :item_questions 2

app\controllers\item_questions_controller.rb

ruby

1class ItemQuestionsController < LoginController 2 #before_action :logged_in_user, only: [:new, :create, :update] 3 def update 4 @question = ItemQuestion.find(params[:id]) 5 @question.update(question_params) 6 end 7end

app\javascript\packs\item_questions\show.js

javascript

1$(document).on('click', '.js-edit', function() { 2 let parents = $(this).parents('.faq'); 3 let value = $(parents).find('.input-text').val(); 4 let questionId = $(parents).find('.js-faq-id').text(); 5 6 7 $.ajax({ 8 url: '/item_questions/' + questionId, 9 type: 'PATCH', 10 cache: false, 11 data: {answer_text: value} 12 }); 13 14 15 }); 16

エラーメッセージ

error

1ActionController::RoutingError (No route matches [PATCH] "/update"):

分かる方教えていただけないでしょうか?
宜しくお願いします。

追記

controllerの一行目、
before_action :logged_in_user
をコメントアウトすると、通りました。

このlogged_in_user()の目的は、ログインしてないと登録、更新はさせないという意図です。
コードは、このようになってます。
app\controllers\concerns\login_controller.rb

ruby

1class LoginController < ApplicationController 2 3 private 4 # beforeアクション ログイン済みユーザーかどうか確認 5 def logged_in_user 6 unless logged_in? 7 store_location 8 flash[:danger] = "ログインしてください" 9 redirect_to login_url 10 end 11 end 12 13 14 15end

追記

logged_inは、SessionHelperから呼び出してます。
Railsチュートリアルを流用しました。

ruby

1module SessionsHelper 2 3 # 渡されたユーザーでログインする 4 def log_in(user) 5 session[:user_id] = user.id 6 end 7 8 # ユーザーのセッションを永続的にする 9 def remember(user) 10 user.remember 11 cookies.permanent.signed[:user_id] = user.id 12 cookies.permanent[:remember_token] = user.remember_token 13 end 14 15 # 現在ログイン中のユーザーを返す (いる場合) 16 def current_user 17 if (user_id = session[:user_id]) 18 @current_user ||= User.find_by(id: user_id) 19 elsif (user_id = cookies.signed[:user_id]) 20 user = User.find_by(id: user_id) 21 if user && user.authenticated?(:remember, cookies[:remember_token]) 22 log_in(user) 23 @current_user = user 24 end 25 end 26 end 27 28 # ユーザーがログインしていればtrue、その他ならfalseを返す 29 def logged_in? 30 !current_user.nil? 31 end 32 33 # 永続的セッションを破棄する 34 def forget(user) 35 user.forget 36 cookies.delete(:user_id) 37 cookies.delete(:remember_token) 38 end 39 40 # 現在のユーザーをログアウトする 41 def log_out 42 forget(current_user) 43 session.delete(:user_id) 44 @current_user = nil 45 end 46 47 # 記憶したURL (もしくはデフォルト値) にリダイレクト 48 def redirect_back_or(default) 49 redirect_to(session[:forwarding_url] || default) 50 session.delete(:forwarding_url) 51 end 52 53 # アクセスしようとしたURLを覚えておく 54 def store_location 55 session[:forwarding_url] = request.original_url if request.get? 56 end 57 58 end 59

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

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

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

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

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

winterboum

2021/03/31 08:02 編集

config/routesを載せて あ 載ってますね。 これ全部?
pecchan

2021/03/31 11:23

有難う御座います。 ご質問でピンときました。 コントローラの先頭にこれがありました。 before_action :logged_in_user, only: [:new, :create, :update] ログイン必須のアクションは、これを追加しておりました。 updateを外すと更新が通りました。 ですがどうなんでしょう? このままだとログインしてないユーザからもupdateが呼び出してしまうし・・・・。うーん。
winterboum

2021/03/31 13:26

logged_in_user はどんなcode?
pecchan

2021/03/31 17:52

有難う御座います。 追記致します!
pecchan

2021/03/31 23:23

度々すみません。 追記致します。 SessionsHelperというヘルパーから呼び出してました。 こちらはRailsチュートリアルで作成したものです。
guest

回答1

0

自己解決

jsからajax()ではなく、
form_with/local: falseでajaxを使うように変更します。

作り直しになるためいったんcloseさせていただきます。
お騒がせしてすみません。

投稿2021/04/01 01:32

pecchan

総合スコア591

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問