2016-10-25 2 views
0

routes.rb

resources :videos, except: [:create, :update] do 
    collection do 
    get "/search", to: "videos#search", as: "search" 
    end 
    resources :comments, except: [:show, :index] 
end 

모델/video.rb

def self.search(search) 
    if search 
    find(:all, conditions: ['tag LIKE ?', "%#{search}%"]) 
    else 
    find(:all) 
    end 
end 

videos_controller.rb에 대한 행위로서의 taggable-와 비디오 객체 태그에 대한 간단한 검색

def search 
    @results = Video.search(params[:search]) 
end 

index.html.erb

<div class=""> 
    <%= form_tag search_videos_path, method: 'get' do %> 
    <%= label_tag(:search, "Search") %> 
    <%= text_field_tag :search, "Search by video tag", params[:search] %> 
    <%= submit_tag "Search", name: nil %> 
    <% end %> 
</div> 
,210

레일 레일, 보석

undefined method `stringify_keys' for nil:NilClass 

이 라인을 강조, 비디오 인덱스 페이지를로드

이 ...

<%= text_field_tag :search, "Search by video tag", params[:search] %> 

나는 또한 비디오 컨트롤러 인덱스 방법에 대한 검색을 가리키고 논리를 포함하는 시도 ... 반환 그리고 거기에 @results.

act-as-taggable-on gem은 각 비디오에 태그 배열을 제공하며 각 태그는 문자열입니다. 동영상 색인에서 태그를 기반으로 동영상을 검색하려고합니다. 나는 내가 뭘 잘못하고 있는지 확신하지 못한다. 어떤 도움이라도 대단히 감사하겠습니다. 대답을 알리는 관련 코드를 게시하는 것을 잊어 버린 경우 알려주십시오. 감사!

답변

0

나는 이것을 원한다고 생각합니다.

<%= text_field_tag :search, params[:search] %> 

텍스트 "search by video tag"는이 태그 외부의 라벨 태그입니다.

find(:all, conditions: ['tag LIKE ?', "%#{search}%"]) 

당신이 구문 분석이

tagged_with(search, :parse => true) 

을 할 수 그들이 사용하는 경우 태그를 분할 : 당신은 대신의 자리 표시 자 옵션

또한
<%= text_field_tag :search, params[:search], :placeholder => "Search by video tag" %> 

을 추가하는 의미가 있습니다 구분 기호를 입력하고 목록에서 OR을하십시오. tagged_with 메소드에 전달 된 옵션 해시에서이를 제어 할 수 있습니다.

0

Swards으로 제안되었지만 자리 표시 자 텍스트를 제거하면 검색이 여전히 작동하지 않는 데 도움이되었습니다. 여기

videos_controller.rb ... 일 결국 무엇

def search 
    if params[:search] 
     @results = Video.tagged_with(params[:search]) 
    end 
    end 

뷰/동영상/_search_form.html.erb

<%= form_tag search_videos_path, method: 'get' do %> 
    <%= label_tag(:search, "Search") %> 
    <%= text_field_tag :search, params[:search] %> 
    <%= submit_tag "Search", name: nil %> 
<% end %> 

와 나는 완전히 # 모델에서 위의 게시 된 코드를 삭제/지금과 같은 video.rb, ...

모델/video.rb

class Video < ActiveRecord::Base 
    after_create { validates_presence_of :user, :post } 

    belongs_to :user 
    belongs_to :post 
    has_many :comments 

    validates :title, presence: true 
    acts_as_taggable 
end 
+0

가 보이는 말을해야합니다,하지만 난이 개선 어떻게 표시되지 않는 이유는 무엇입니까? – Swards

0

여러 소스의 도움을 얻은 것 같습니다... 검색 2 개 방식은,이된다

1 검색

결과 인덱스 페이지가 이미 가지고, 또는 b)를 새로 생성에 결과를 표시) : 우리는 조금 그것을 청소 할 수 있는지 볼 수 있습니다 경로가 "/ search"라고 말하면 사용자는 원하는 경우 북마크 할 수 있습니다. 색인 접근 방식을 선호하지만 어느 쪽이든 할 수 있습니다. 인덱스 접근 방식을 사용하려면 검색 경로를 제거하고 컨트롤러를 변경합니다

def index 
    @videos = params[:search].nil? ? Video.all : Video.search(params[:search]) 
end 

또한 search_videos_path에서 videos_path에 양식의 경로를 변경해야합니다 - 하나를 사용 만이이 방법을 주형. 자체 컨트롤러로 검색을 계속하려면 액션도 괜찮습니다. Rour route와 contoller는 현재와 동일하게 유지 될 수 있습니다.

2 모델 검색

당신은 실제로 비디오 테이블을 검색하지 않습니다 - 당신은 태그 테이블을 검색 할 필요가있다. 보석에는 이것을위한 방법이 있는데, 그것은 tagged_with입니다. 또한 검색 결과 만 반환하기 때문에 else 문을 추가해야합니다. 그래서 (대신 그 자리 표시 자입니다 - 그것은 텍스트 "비디오 태그로 검색"사용하지 않는 것 때문에

def self.search(search) 
    videos = Video.tagged_with("#{search}", :any => true) 
    return videos 
    end 

3 만들기 검색 텍스트

이 양식을 변경

자리 표시 자 : 그래서처럼 보이도록 모델을 업데이트 사용자는 입력을 시작하기 전에 삭제할 필요가 없습니다). 또한 이전 결과를 포함 할 필요가 없습니다. 이는 귀하에게 달려 있습니다. 당신이 그들을 원하는 경우에, 당신은 당신이 이전 응답에서 필요한 모든있어 및 문제 해결 같은 search: params[:search]

<%= form_tag search_videos_path, method: 'get' do %> 
    <%= label_tag(:search, "Search") %> 
    <%= text_field_tag :search, "", placeholder: "Search by video tag" %> 
    <%= submit_tag "Search", name: nil %> 
    <% end %> 
+0

당신이 제안하는'video # search' 리펙터의 장점은 무엇입니까? '# model/video.rb'에 추가하지 않고 지금 내 답변에 게시 된 것처럼 잘 작동하는 것 같습니다. 나는 둘 다 시도했고 그들은 똑같이 기능하는 것처럼 보인다. –