0

Rails 3 アプリで Ajax 検索を理解しようとしています。この投稿は、Railscast から借用しています。現在、送信しても何も起こらず、Chrome コンソールにアクセスすると、次のエラーが表示されます。

GET http://localhost:3000/search?utf8=%E2%9C%93&search=&_=1361491523102 404 (Not Found)

posts.js の 5 行目は責任があるようですが、それは jQuery 呼び出しのように見えるので、何が間違っているのかわかりません。

私の関連コード:

posts.js.コーヒー

jQuery ->
    # Ajax search on submit
    $('.search_form').submit( ->
        $.get(this.action, $(this).serialize(), null, 'script')
        false
  )

posts_controller.rb

def show
  @search = Post.search(params[:search])

  respond_to do |format|
    format.html # show.html.erb
    format.json { redirect_to @post }
  end
end

def search
  @search = Post.search(params[:search])
  render json: { results: @search }
end

post.rb

def self.search(search)
  if search
    where('name LIKE ?', "%#{search}%")
  else
    scoped
  end
end

show.html.erb

<%= form_tag search_path, method: "get", class: "search_form form-inline",
 style: "display:inline-block;" do %>
    <%= text_field_tag :search, params[:search], placeholder: "Search:", id: "search_field" %>
    <%= submit_tag("Search", name: nil, class: "btn search", remote: true) %>
<% end %>

# Testing for @search stops it from pulling a "no method '.first' for nil NilClass" error.
<div id="list"><%= render partial: 'list', locals: { search: @search } if @search%></div>

list.html.erb

<ul>
    <% @search.each do |p| %>
        <li><a href=<%= p.id %> ><%= p.name %> <span class="manual_small">(<%= p.created_at.strftime("%b %d, %Y") %>)</span></a></li>
    <% end %>
</ul>

ここで何がうまくいかないのですか?

編集 - ルートファイルの関連行を追加:

resources :posts

# ...

match '/search', to: 'posts#search'

私はすでにそこに「/search」ルートを持っていました。そうですか - その場合、問題は別の場所にありますか? コードの残りの部分はきれいに見えますか?

編集 -- ダミアンの報告によると、PostsController に検索メソッドを追加しました。新しい興味深い点は、a) パーシャルの呼び出し方法、新しい検索アクション、そして Post.rb の show メソッドの内容を "Post.all" に置き換えようとしたが、それでもうまくいかなかったという事実です。何でも見せます。ただし、エラーはスローされません。

4

1 に答える 1

1

「検索アクションがありません!必要なことに気づきませんでした。何が含まれている必要がありますか?AJAXなしでこれの以前のバージョンを試したとき、基本的にshowのレプリカ(+ @searchなど)である検索アクションがありました。すべて同じ変数です。それ以外の場合は、ショー ページをレンダリングするため、機能しません。それは正しい考えですか? 非常に未乾燥に見えました。"

AJAX を使用すると、ページ全体をレンダリングする必要はありませんshow。フィルタリングされた結果を目的の形式で返すだけです。

def search
  @search = Post.search(params[:search])
  render json: { results: @search }
end

必要に応じて、フォーマット ベースの返品を追加します。

于 2013-02-22T14:06:22.973 に答える