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

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

詳細はこちら
Ruby on Rails

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

Q&A

2回答

1611閲覧

Routing Errorの原因がわかりません。

takuo5

総合スコア48

Ruby on Rails

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

0グッド

0クリップ

投稿2019/12/13 08:28

編集2019/12/15 09:43

前提・実現したいこと

railsで作ったblogアプリに下記URLを参考にして記事の検索機能を実装しようとしています。
リンク内容
上記のサイトに書かれているコードをすべて打ち込んで、search.html(検索のページ)へアクセスしようと試みましたがroutingエラーがでました。
下から2番目の段に確かにsearchのpathの表示があるのですが、なぜエラーが出るのかわかりません。

発生している問題・エラーメッセージ

イメージ説明
イメージ説明
イメージ説明

 routes.rb

Rails.application.routes.draw do devise_for :users, :controllers => { :registrations => 'users/registrations', :sessions => 'users/sessions' } resources :articles root "articles#index" get 'articles/search' # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html end

 search.html.erb

<p>検索</p> <%= form_tag(search_path,:method => 'get') do %> <%= text_field_tag :search %> <%= submit_tag 'Search', :name => nil %> <% end %> <ul><% @articles.each do |article| %> <li> <%= link_to article.title, article %> <%= article.created_at %> <%= article.status %> </li> <%= link_to "編集",edit_article_path(article) %> <%= link_to "削除",article, method: :delete %> <% end %> </ul>

 articles_controller.erb

class ArticlesController < ApplicationController before_action :authenticate_user! before_action :find_article, only: [:show, :edit, :update, :destroy] before_action :validate_user, only: [:show, :edit, :update, :destroy] def index @articles = current_user.articles.order(created_at: :desc) end def show end def new @article = Article.new end def edit end def create @article = Article.new(article_params) @article.user_id = current_user.id if @article.save redirect_to @article, notice: '作成できました' else render :new, alert: '作成できませんでした' end end def update if @article.update(article_params) redirect_to @article, notice: '更新できました' else render :edit, alert: '更新できませんでした' end end def destroy if @article.destroy redirect_to root_path, notice: '削除に成功しました' else redirect_to root_path, alert: '削除できませんでした' end end def search #Viewのformで取得したパラメータをモデルに渡す @articles = Article.search(params[:search]) end private def find_article @article = Article.find(params[:id]) end def article_params params.require(:article).permit(:title, :body, :image ) end def validate_user if @article.user != current_user redirect_to root_path, alert: '自分の投稿ではありません' end end def validate_user if @article.user != current_user redirect_to root_path, alert: '自分の投稿ではありません' end end end

 article.rb

class Article < ApplicationRecord belongs_to :user validates :title, presence: true validates :body, presence: true attachment :image def self.search(search) return Article.all unless search Article.where(['content LIKE ?', "%#{search}%"]) end end

rails routesの結果

$ rails routes Prefix Verb URI Pattern Controller#Action new_user_session GET /users/sign_in(.:format) users/sessions#new user_session POST /users/sign_in(.:format) users/sessions#create destroy_user_session DELETE /users/sign_out(.:format) users/sessions#destroy new_user_password GET /users/password/new(.:format) devise/passwords#new edit_user_password GET /users/password/edit(.:format) devise/passwords#edit user_password PATCH /users/password(.:format) devise/passwords#update PUT /users/password(.:format) devise/passwords#update POST /users/password(.:format) devise/passwords#create cancel_user_registration GET /users/cancel(.:format) users/registrations#cancel new_user_registration GET /users/sign_up(.:format) users/registrations#new edit_user_registration GET /users/edit(.:format) users/registrations#edit user_registration PATCH /users(.:format) users/registrations#update PUT /users(.:format) users/registrations#update DELETE /users(.:format) users/registrations#destroy POST /users(.:format) users/registrations#create root GET / articles#index articles_search GET /articles/search(.:format) articles#search articles GET /articles(.:format) articles#index POST /articles(.:format) articles#create new_article GET /articles/new(.:format) articles#new edit_article GET /articles/:id/edit(.:format) articles#edit article GET /articles/:id(.:format) articles#show PATCH /articles/:id(.:format) articles#update PUT /articles/:id(.:format) articles#update DELETE /articles/:id(.:format) articles#destroy refile_app /attachments #<Refile::App app_file="/home/ec2-user/.rvm/gems/ruby-2.6.3/bundler/gems/refile-e690bf5c2d83/lib/refile/app.rb">

補足情報(FW/ツールのバージョンなど)

AWS Cloud9

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

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

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

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

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

urbainleverrier

2019/12/15 13:31

/articles/searchと/articles/:idが被っているからではないでしょうか? routesで順番を先にすると解決すると思います。
takuo5

2019/12/15 15:16

ご回答頂きましてありがとうございます。 上記にroutes.rbをきさしておりますが、これをどのように並び替えるのが正解でしょうか。 お手数おかけいたしますが、教えていただけないでしょうか。
urbainleverrier

2019/12/15 15:24

``` + get 'articles/search' resources :articles root "articles#index" - get 'articles/search' ``` こんな感じでどうでしょうか
takuo5

2019/12/17 00:36

ご提案頂いた通り直して試してみましたが、エラー表示が出ました。 エラーメッセージの 'id=search'のsearchがなくなった形で表示されています。
urbainleverrier

2019/12/17 04:20

そうですか。ですが、原因はrouteを正しく設定できていないことに間違い無いと思います。find_articleはget methodであれば、showかeditを呼ばない限りcallすることはありません。 id: searchが無いとerrorが出るので、/articles/:idの部分が/articles/searchとプログラムで判断されています。 なので、/articlesに続くpathを設定する場合は、/articles/:idが判断されるより早い段階でrouteをsubscriptさせる必要があります。 routes.rbを適宜いじってみてください。
guest

回答2

0

下から2段めは /articles/searchであって、/searchではないです。
<%= form_tag(search_path,:method => 'get') do %> を
<%= form_tag(articles_search_path,:method => 'get') do %>
にしてください

投稿2019/12/13 09:10

winterboum

総合スコア23567

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

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

takuo5

2019/12/13 14:09

ご回答いただきましてありがとうございます。 <%= form_tag(articles_search_path,:method => 'get') do %> に変更して/articles/seachにアクセスしてみると新たなエラーが出ました。(上記にスクショ追加しました) controllerのprivateメソッド内にfind_articleの記述をしているのですが、before_actionにsearchを追加すれば動作すると思い、:searchを追加したのですが結果は同じでした。 もし可能であれば上記のエラーの解消方法もご提案にいただけないでしょうか。
winterboum

2019/12/13 21:32

その新たなエラーはどのタイミングででましたか? サーチするとき?
takuo5

2019/12/15 05:58

このエラーはform_tagの部分を修正した後、/articles/searchのURLにアクセスしたときに出ました。 エラーが出てページにアクセスできません。
winterboum

2019/12/15 06:06 編集

「タイミング」とはどのviewのどの要素で起きたのかを知りたいのです。codeとそのどの行なのかが判るようにして下さい。 あと、routs.rbが必要になりそうだな. ああ、あった。 順番が悪い。 resources :articles root "articles#index" get 'articles/search'  ⇓ root "articles#index" get 'articles/search' resources :articles
takuo5

2019/12/15 09:22

説明が悪くて申し訳ありません。。 viewは上記のsearch.htmlです。 URLに"/articles/search"と打ち込んでenterを押した瞬間にエラーが表示されます。 スクショの通り、 articles_controller.erbのprivateメソッド内にに書かれている'find_article'のアクションで起こっていると表示されていますが、原因がよくわからない状態です。 routes.rbをご指示いただきましたとおり修正いたしました。しかしながらこの状態ではまだ同じエラーが表示されるようです。
winterboum

2019/12/15 09:33

couldn`t find article id=search ですか?
takuo5

2019/12/15 09:37

はい、そのエラーが表示されるので、search.html.erbが表示されません。
winterboum

2019/12/15 09:39

rails routes の結果見せてください
takuo5

2019/12/15 09:43

上記にrails routesの結果を追加いたしました。
winterboum

2019/12/15 09:48

え〜〜〜合ってるなぁ。なぜだ??
guest

0

僕も初心者の域を出ないのですが

<%= form_tag(search_path,:method => 'get') do %>

となっていますがrails routesの結果のパスを見ると

<%= form_tag(articles_search_path,:method => 'get') do %>

とするのが正しいのでは?

投稿2019/12/17 04:00

story_aniki

総合スコア197

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

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

takuo5

2019/12/17 05:15

ありがとうございます。 ご指摘いただいた通り、<%= form_tag(articles_search_path,:method => 'get') do %>にすでに修正しており、その後に上記の3枚目のスクショのエラーが発生してその解決に現在取り組んでおります。 なにか良い方法があればご提案いただければ助かります。
story_aniki

2019/12/17 05:34

上二枚のエラーのスクショは修正前に出た時のスクショですよね? そうでないとすると、修正が反映されてないことになりませんか?
takuo5

2019/12/17 05:52

わかりませんが、3枚目のエラーはまた別のことが原因で起こったと認識しています。
story_aniki

2019/12/17 06:25

レールズチュートリアルをベースに改良したもののようですので、herokuを使っているのかもしれませんが、上記エラーが今現在起こっていて、rails routesの結果がそのようになっているのであれば、修正後のコードがうまくherokuにデプロイできていないと考えます herokuのページから、修正後のコードがちゃんと反映されているか確認できますでしょうか?
story_aniki

2019/12/17 06:26

ちなみにローカル環境で動かしても同じエラーが出ますか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問