Rails Ajax搜索没有做任何事情 - 404错误

时间:2013-02-22 00:26:25

标签: javascript ruby-on-rails ruby-on-rails-3 jquery

尝试在this post之后的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.coffee

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'路线。这是对的 - 在这种情况下,问题出在其他地方吗?其余代码看起来是否很好?

编辑 - 根据Damien的rec,将搜索方法添加到PostsController。感兴趣的新东西是a)我调用部分,新搜索操作的方式,然后我试图用Post.rb替换show.rb中show方法的内容,它仍然没有什么都有。但是,没有错误抛出。

1 个答案:

答案 0 :(得分:1)

  

“没有搜索行动!没有意识到我需要一个。应该是什么?   当我尝试没有AJAX的早期版本时,我进行了搜索   动作基本上是show(+ @search等)的复制品,全部   相同的变量,否则它将无法工作,因为它呈现   节目页面。这是正确的想法吗?它看起来非常简单“

使用AJAX,无需呈现整个show页面。只需返回所需格式的过滤结果:

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

如有必要,添加基于格式的退货。