前提・実現したいこと
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
/articles/searchと/articles/:idが被っているからではないでしょうか?
routesで順番を先にすると解決すると思います。
ご回答頂きましてありがとうございます。
上記にroutes.rbをきさしておりますが、これをどのように並び替えるのが正解でしょうか。
お手数おかけいたしますが、教えていただけないでしょうか。
```
+ get 'articles/search'
resources :articles
root "articles#index"
- get 'articles/search'
```
こんな感じでどうでしょうか
ご提案頂いた通り直して試してみましたが、エラー表示が出ました。
エラーメッセージの 'id=search'のsearchがなくなった形で表示されています。
そうですか。ですが、原因はrouteを正しく設定できていないことに間違い無いと思います。find_articleはget methodであれば、showかeditを呼ばない限りcallすることはありません。
id: searchが無いとerrorが出るので、/articles/:idの部分が/articles/searchとプログラムで判断されています。
なので、/articlesに続くpathを設定する場合は、/articles/:idが判断されるより早い段階でrouteをsubscriptさせる必要があります。
routes.rbを適宜いじってみてください。