0

试图在 Rails 3 应用程序中找出 Ajax 搜索,遵循这篇文章,它本身是从 Railscast 借来的。目前,当我提交时,什么都没有发生,如果我进入 Chrome 控制台,我会看到这个错误:

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

posts.js 第 5 行似乎是有罪的,但这似乎是 jQuery 调用,所以我不确定我做错了什么。

我的相关代码:

post.js.coffee

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

post_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

显示.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'

我已经在那里有了“/搜索”路线。对吗?在这种情况下,问题出在其他地方吗?其余的代码看起来不错吗?

编辑——根据 Damien 的建议,向 PostsController 添加了搜索方法。感兴趣的新事物是 a) 我调用部分的方式,新的搜索操作,然后我尝试用“Post.all”替换 Post.rb 中的 show 方法的内容,但它仍然没有显示任何东西。但是,没有抛出错误。

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 回答