0

Tire::Model::Persistence を使用して Elasticsearch をデータストアとして使用する方法を学習しようとしている非常に単純な rails3 アプリがありますが、検索に問題があります (検索の場合)。

これが私のモデルです:

class Post
  include Tire::Model::Persistence

  property :name
  property :published_on
end

これが私のルートです:

Beta2::Application.routes.draw do
   root :to => 'posts#index'

  resources :posts
end

これが私のコントローラーです:

class ContestsController < ApplicationController

  def index
    if params[:q].present?
      #@posts = Post.search(params[:q], load: true)
      @posts = Post.all
    else
      @posts = Post.all
    end

    respond_to do |format|
      format.html # index.html.erb
      format.json { render json: @posts }
    end

  end
...show, edit, destroy...
end

私のindex.html.erb:

<h1>Listing posts</h1>

<%= form_tag posts_path, method: :get do %>
  <%= label_tag :query %>
  <%= text_field_tag :q, params[:q] %>
  <%= submit_tag :search, name: nil %>
<% end %>

<hr>

<table>
  <tr>
    <th>Name</th>
    <th>Published on</th>
    <th></th>
    <th></th>
    <th></th>
  </tr>

<% @posts.each do |post| %>
  <tr>
    <td><%= spot.name %></td>
    <td><%= post.published_on %></td>
    <td><%= link_to 'Show', post %></td>
    <td><%= link_to 'Edit', edit_contest_path(post) %></td>
    <td><%= link_to 'Destroy', post, method: :delete, data: { confirm: 'Are you sure?' } %></td>
  </tr>
<% end %>
</table>
<br />

<%= link_to 'New Post', new_post_path %>
<%= link_to 'Back', posts_path if params[:q] %>

上記では、パラメーターなしで index メソッドを表示するだけで、問題なくレンダリングされます。if params[:q] をコメントアウトして、通常の旅行と同じようにすべての投稿を返すようにしました

http://localhost:3000/

ただし、その検索ボタンを押すとすぐに、次のエラー メッセージが表示されます: Routing Error

{:action="show", :controller="posts"} に一致するルートはありません

ビュー内の行を <%= link_to ... %> に削除すると、ビューはすべての投稿の名前と published_on テキストでレンダリングされます。

コントローラーで変更した場合:

#@posts = Post.search(params[:q], load: true)

戻る

@posts = Post.search(params[:q], load: true)

Post.allを削除します

次に、テンプレートで次のエラーが発生します。

undefined method `detect' for #<Post:0x00000003a61b40>

Extracted source (around line #21):

18:     <th></th>
19:   </tr>
20: 
21: <% @posts.each do |post| %>
22:   <tr>
23:     <td><%= post.name %></td>
24:     <td><%= post.published_on %></td>

おそらく私が行っていない簡単なことがあるのですが、それを理解することはできません.現在、唯一のデータストアとしてレールでタイヤを使用するだけの優れた例がないため、これが単にあいまいな問題であるかどうかはわかりません.アクティブレコードを使用していないときに遭遇します。

4

1 に答える 1

0

特定のフィールドに一致する Post.search{query{term :name, params[:q]}} または
任意のフィールドと文字列全体に一致する Post.search{query{string "#{params[:q]}"}}または
Post.search{query{wildcard "#{params[:q]}*"}} 部分的な文字列を任意のフィールドに一致させる

于 2012-09-18T19:59:20.353 に答える