2016-12-01 2 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

하면, 로그를 확인하셨습니까

은 SQL 주입 및 PARAM 보간에 읽기? 이 요청의 레일즈 서버 로그를 게시 할 수 있습니까? –

+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 ('과 같은 것을 입력하면 어떻게 될까요? 나는 이것을 다음과 같이 다시 쓰겠습니다 :

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

주의 사항 또한 검색이 비어있을 때 Movie.scoped를 모두 반환합니다. 관계를 리턴하는 .all은 order과 다른 체인을 호출 할 때 원하지 않는 무비 오브젝트의 배열을 리턴합니다. 원하는 검색 매개 변수를 얻는 경우 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 % 불가능하다고 말할 수는 없지만 쿼리 문자열에 직접 삽입하는 것이 가장 일반적인 실수입니다. 마지막 두 링크를 통해 쿼리 작성 방법 및 기타 주입 예제에 대해 자세히 알아보십시오. – mlabarca

관련 문제