2016-12-01 27 views
0

レールの検索バーを作成する方法を学習しています。私は映画という名前のモデルを持っています。私はタイトルで映画を検索し、結果を表示したいと思います。私は「新しい」ビューでこれをやっています。「インデックス」ではありません。私は結果にwill_paginateも使用しています。現在のところ、私の検索は映画が存在していても結果を提示しません。私が検索をしないと、私はまだ私の映画すべてを見ることができます...しかし明らかに、私は検索機能も必要です。助けてもらえますか?検索で正しい結果が見つかりません

新しいムービービュー:

<div class="row"> 
<div class="col-xs-12"> 
    <h2 class="white">Home</h2> 
    <hr /> 
    <h4 class="white">Add Movie</h4> 
    <%= form_for @movie, class: 'form-horizontal' do |m| %> 
     <div class="form-group"> 
      <label for="title" class="white">Title: </label><br/> 
      <%= m.text_field :title, class: 'form-control' %> 
     </div> 
     <div class="form-group"> 
      <label for="title" class="white">Year: </label><br/> 
      <%= m.text_field :year, class: 'form-control' %> 
     </div> 
     <div class="form-group"> 
      <%= m.submit %> 
     <div class="form-group"> 
    <% end %> 
</div> 
</div> 

<hr /> 

<div class="row"> 
<div class="col-xs-12"> 
<h4 class="white">Database</h4> 
<%= form_tag new_movie_path, :method=> 'get' do %> 
    <%= text_field_tag :search, params[:search] %> 
    <%= submit_tag "Search" %> 
<% end %> 
<br /> 
    <% if @movies.exists? %> 
    <div class="bg_white"> 
     <table class="table table-hover table-striped"> 
     <tr> 
      <th> 
       Title 
      </th> 
      <th> 
       Status 
      </th> 
      <th> 
       Year 
      </th> 
      <th> 
       Delete 
      </th> 
      <th> 
       Edit 
      </th> 
     </tr> 
     <% @movies.each do |m| %> 
     <tr> 
      <td> 
       <%= link_to m.title, new_movie_rental_path(m) %> 
      </td> 
      <td> 
       <%= m.status %> 
      </td> 
      <td> 
       <%= m.year %> 
      </td> 
      <td> 
       <%= link_to "Delete", movie_path(m), method: :delete %> 
      </td> 
      <td> 
       <%= link_to "Edit", edit_movie_path(m) %> 
      </td> 
     </tr> 
     <% end %> 
     </table> 
    </div> 
    <%= will_paginate @movies, class: 'white' %> 
    <% else %> 
     <p class="white">No movies have been entered</p> 
    <% end %> 
</div> 
</div> 
<div class="row"> 
<div class="col-xs-12"> 
    <hr /> 
    <%= link_to "Add Customer", new_customer_path, class: 'white' %> 
</div> 
</div> 
<br /><br /> 

作品のモデル:

class Movie < ApplicationRecord 
has_many :rentals, dependent: :destroy 


def status 
    if self.rentals.empty? 
     return "In Stock" 
    else 
     self.rentals.order(borrowed_on: :desc).each do |x| 
      if !x.returned_on.nil? 
       return "In Stock" 
      else 
       return "Rented" 
      end 
     end 
    end 
end 

def self.search(search) 
    if search 
     @movies = Movie.where(["title","%#{[:search]}%"]) 
    else 
     all 
    end 
end 

end 

作品コントローラ

def new 
    @movie = Movie.new 
    @movies = Movie.search(params[:search]).order(title: :asc).paginate(:page => params[:page], :per_page => 15) 
end 
+0

あなたは、ログをチェックしましたか? このリクエストのレールサーバーログを投稿してください。 –

+0

「うまくいきません」というのはあまり役に立ちません。このコードは何をすべきか、現在何をしていますか? – tadman

+0

結果が表示されません。エラーはありません。結果が得られません。テーブルは空白です。 –

答えて

1

私は問題は検索として、あなたが持っているこの、このクラスのメソッドであると言うだろう範囲:

def self.search(search) 
    if search 
    @movies = Movie.where(["title","%#{[:search]}%"]) 
    else 
    all 
    end 
end 

検索パラメータをクエリに挿入しようとしていたようですが、この場合#{}を使用すると、補間する代わりにシンボル検索を渡しています。したがって、クエリはSELECT 1 AS one FROM "movies" WHERE (title)になります。しかし、もっと重要なのは、クエリに直接補間することで、SQLインジェクションに非常に脆弱であることです。ユーザーが')DROP TABLE MOVIES ('のような検索フィールドに入力するとどうなりますか?また、私は検索が空になったときに代わりにすべてのMovie.scoped戻ってるか

def self.search(search = nil) 
    if search 
    Movie.where('title LIKE :search', search: "%#{search}%") 
    else 
    Movie.scoped 
    end 
end 

お知らせ;:私はこのようにそれを書き換えたいですあなたがorderとそれに他のチェーンを呼び出すならば、望ましくないムービーオブジェクトの配列を返します。

読むには、SQLインジェクションやPARAM補間に:あなたが希望の検索パラメータを取得している場合 http://rails-sqli.org/#where http://api.rubyonrails.org/v5.0.0.1/classes/ActiveRecord/QueryMethods.html#method-i-where

+0

ありがとうございます!これは問題を解決しました。 –

+0

それでは、上記の方法でSQLインジェクションからデータベースを保護しますか? –

+0

私は注射の専門家ではないので、100%できないとは言えませんが、クエリ文字列に直接補間するのが最も一般的な誤りです。最後にこれら2つのリンクを読んで、クエリーの作成方法やその他のインジェクションの例についての詳細を学んでください。 – mlabarca

関連する問題