

# 環境

Ruby on Rails 6  
Amazon Linux2  
Amazon EC2

# 問題が起こった経緯

動画サイトでの検索→検索結果画面表示の途中で問題が起きました。  
１．共通レイアウト内の検索フォームを使って検索  
２．検索機能（search）で検索：  
ファイル名（:key）またはカテゴリー名（:category）で動画テーブルをWhere  
３．検索機能（search）で検索結果画面をrender  
４．検索結果画面（search_result）：検索結果を一覧表示

# 問題

renderしたはずの検索結果画面（search_result）が表示されません。

[code]

    Rendered s3files/search_result.html.erb within layouts/application (Duration: 3.8ms | Allocations: 628)
    
    
[/code]

代わりにrootURLに設定したホーム画面が表示されます。  
ログインしていなかったためrootに遷移されたわけでもありませんでした。  
初めての類の問題で困っております。

# 関連ファイル

## routes.rb

[code]

    Rails.application.routes.draw do
      root 's3files#home'
      resources :users do
        resources :channels
      end
      get 's3files/home', to: 's3files#home'
      get 's3files/music', to: 's3files#music'
      get 's3files/movie', to: 's3files#movie'
      get 's3files/program', to: 's3files#program'
      get 's3files/game', to: 's3files#game'
      get 's3files/news', to: 's3files#news'
      get 's3files/sports', to: 's3files#sports'
      get 's3files/learning', to: 's3files#learning'
      post 's3files/search', to: 's3files#search'
      get 's3files/search_result', to: 's3files#search_result'
      resources :s3files
      resources :comments
      resources :sessions, only: %i[create]
    end
    
[/code]

##s3files_controller.rb

[code]

    class S3filesController < ApplicationController
      
      skip_before_action :check_logged_in
      
      ------------------------省略------------------------
    
      def home
        @s3files = S3file.all
        @trend = S3file.joins(:one_day_view).order(count: :desc).limit(10)
      end
    
      ------------------------省略------------------------
      
      def search
        if params[:key]
          @s3files = S3file.where(key: params[:key])
        else params[:category]
          @s3files = S3file.where(key: params[:key])
        end
        render 'search_result'
      end
        
      
      def search_result
      end
      
      private
      ------------------------省略------------------------
    
        def s3file_params
          params.require(:s3file).permit(:key, :image, :category, :channel_id)
        end
    
      ------------------------省略------------------------
    end
    
    
[/code]

## application.html.erb

[code]

    <!DOCTYPE html>
    <html>
      <head>
        <title>Stream</title>
        <%= csrf_meta_tags %>
        <%= csp_meta_tag %>
    
        <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>
        <%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %>
      </head>
      <body>
       <header>
          <% if current_user %>
            <%= link_to(current_user.name, current_user) %>
          <% else  %>
            <%= link_to "ゲストログイン(閲覧用)", sessions_path, method: :post %>
          <% end %>
          <%= render 's3files/search_form' %>
        </header>
        <%= yield %>
      </body>
    </html>
    
[/code]

##_search_form.erb

[code]

    <h2>検索フォーム</h2>
    <%= form_with(model: S3file.new, url: '/s3files/search') do |form| %>
      <%= form.label :key %> 
      <%= form.text_field :key %>
      <%= form.label :category %> 
      <%= form.text_field :category %>
      <%= form.submit "検索" %>
    <% end %>
    
[/code]

## search_result.html.erb

[code]

    <h1>検索結果</h1>
    <% @s3files.each do |s3file| %>
      <p>チャンネル名：<%= s3file.channel.name %></p>
      <p>動画タイトル：<%= s3file.key %></p>
      <%= link_to(image_tag("https://bucket-for-stream.s3.ap-northeast-1.amazonaws.com/assets#{s3file.id.to_s}/#{s3file.image}"), s3file) %>
    <% end %>
    
[/code]


CC BY-SA 4.0
2021-12-03T11:31:01.247
83939
2023-01-27T19:05:35.647
49334
question
ruby-on-rails amazon-ec2
renderしたはずのページが表示されない


自己解決しました。  
form_withの引数にlocal: trueを指定するとレンダリングされました。  
Rails6.0のform_withはデフォルトでajaxという非同期通信を使ってページを表示するようです。  
要はajaxという新種の描画処理を意図せず使っていたことがエラーの原因でした。


CC BY-SA 4.0
2021-12-06T04:49:23.330
83974
2021-12-06T04:49:23.330
49334
83939
answer