2016-10-25 27 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に作用-AS-タグ付けできる - とのビデオオブジェクトタグの単純な検索

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> 

Railsの私はまた、ビデオコントローラのindexメソッドへの検索をポイントして、ロジックを含む試してみました...このラインを強調し、...レール、宝石

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

undefined method `stringify_keys' for nil:NilClass 

ビデオインデックスページをロード返しますそこには@結果があります。

act-as-taggable-on gemは、各動画にタグの配列をそれぞれ1つの文字列として与えます。私は、ビデオインデックス内のタグに基づいてビデオを検索しようとしています。私は何が間違っているのか分からない。どんな助けでも大歓迎です。答えを知らせる関連するコードを投稿することを忘れてしまった場合はお知らせください。ありがとう!

答えて

0

私はあなたがこれを望むと信じています。

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

「ビデオタグで検索」というテキストは、これ以外のラベルタグです。あなたは、これに代えて、また

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

プレースホルダオプションを追加することを意図していることがあります。

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

あなたはこの

tagged_with(search, :parse => true) 

、彼らが使用している場合、このタグを解析し、分割しますを行うことができます区切り文字を入力し、リスト上で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

これはいくつかの情報源からの助けを得たようです。

1件の検索では、検索で2つのアプローチがあります

結果)インデックスあなたが既に持っているページ、またはbに結果を表示)、新規に作成します。。我々は少しそれをクリーンアップすることができるかどうかを確認することができますURLに「/ search」と表示され、ユーザーが望むならブックマークを付けることができます。私はインデックスアプローチを好みますが、いずれにしても可能です。 、インデックスのアプローチを使用して、検索のためのルートを削除し、にあなたのコントローラを変更するには: - あなただけのものを使用する必要があります。この道を

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

またsearch_videos_pathからvideos_pathにフォームのパスを変更する必要がありますテンプレート。独自のコントローラー、アクションとして検索を続行したい場合は、それも完璧です。 Rourルートとcontollerは、今のままで同じままにすることができます。

2モデル検索

あなたが実際にビデオテーブルを検索していない - あなたはタグ表を検索する必要があります。この宝石には、tagged_withというメソッドがあります。また、検索の結果のみを返すため、elseステートメントを追加する必要があります。その(代わりに、それはプレースホルダがある - それは、テキスト「videoタグで検索」を使用していないように

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'に何も追加せずに(私の答えで掲示されているように)うまく動作しているようです。私は両方を試み、彼らは同じように機能するようです。 –