如何获取搜索结果

时间:2014-09-14 18:24:28

标签: ruby-on-rails ruby-on-rails-4

所以,我能够发布一个帖子请求并查看搜索结果,但是当我点击刷新时,我收到了一个错误的获取请求错误。

所以,基本上,我无法获取我的搜索结果,但我可以发布我的搜索结果。我怎么能做到这一点?

routes.rb:

  resources :statistics, except: :show do
      collection do
        post :search, as: 'statistics_search' 
      end
    end

错误:

Routing Error
No route matches [GET] "/admin/statistics/search"

控制器代码(statistics_controller.rb)

class SaasAdmin::StatisticsController < SaasAdminController

  inherit_resources

  def index

  end

  def search
    @search = Search.new(params[:search])

    @impressions = Impression.where("impressionable_type = 'Clip' AND impressionable_id = ? AND impressions.created_at BETWEEN ? AND ?", @search.clip, @search.start_date, @search.end_date)
    render 'index'
  end

end 

谢谢!

更新错误

NoMethodError in SaasAdmin::StatisticsController#search
undefined method `each' for nil:NilClass



  def initialize(params = {})
    params.each do |k, v| < --- this is what it's referring to.
      send("#{k}=", v)
    end
  end

search.rb

class Search < ActiveModel::Name
    attr_accessor :clip, :start_date, :end_date
  extend ActiveModel::Naming
  include ActiveModel::Conversion

  def initialize(params = {})
    params.each do |k, v|
      send("#{k}=", v)
    end
  end

    def start_date=(date)
        @start_date = Date.parse(date)
    end

  def end_date=(date)
    @end_date = Date.parse(date)
  end

  def persisted?
    false
  end
end

2 个答案:

答案 0 :(得分:1)

我们创造了&#34; GET&#34;在此处搜索功能:http://firststopcosmeticshop.co.uk


获取

您想要执行以下操作:

#config/routes.rb
resources :statistics, except: :show do
   match :search, as: 'statistics_search', on: :collection, via: [:get, :post]
end

<强>模型

您需要考虑的其他方法是如何使用Search模型。

我不明白你为什么要包含一个单独的Search模型,除了将属性填充到对象中之外什么也不做?当然,将搜索参数传递给class method会更好,这样您就可以带回一个由您想要查看的数据组成的对象。

您可以从this Railscast

更好地了解这一点

enter image description here

我们使用此设置:

#app/models/impression.rb
class Impression < ActiveRecord::Base
   def self.search clip, start_date, end_date
      where("impressionable_type = 'Clip' AND impressionable_id = ? AND impressions.created_at BETWEEN ? AND ?", clip, start_date, end_date)
   end
end

#app/controllers/sass_admin/statistics_controller.rb
class SaasAdmin::StatisticsController < SaasAdminController
  inherit_resources

  def search
    @impressions = Impression.search params[:clip], params[:start_date], params[:end_date]
    render 'index'
  end

end

您可以使用form_tag来支持此功能:

#app/views/your_view.html.erb
<%= form_tag statistics_search_path do %>
   <%= text_field_tag :clip %>
   <%= text_field_tag :start_date %>
   <%= text_field_tag :end_date %>
   <%= submit_tag %>
<% end %>

-

第三方

当然,上述内容只适用于搜索&#34;一个单一的模型,就像你一样。

如果您想将其扩展到多个模型,您将要使用&#34; index&#34;之一。搜索插件。这些工作通过采取您规定的数据和&amp;那么&#34;索引&#34;它们(与谷歌的方式大致相同),您可以使用它搜索索引数据。

您可以看到good Railscast about how to implement this functionality here

如果您想了解更多相关信息,我很乐意更新答案

答案 1 :(得分:0)

Rails路由将尝试找到匹配路径请求方法。换句话说,POST /pathGET /path。在您的情况下,您已定义getpost路由,或仅定义用户match方法以允许任何请求方法:

collection do
  match :search, as: 'statistics_search', via: [:get, :post]
end

更多信息:http://guides.rubyonrails.org/routing.html#http-verb-constraints

更新:虽然以上信息是正确的,但它不能使用您的代码,因为POST请求的参数是在正文中发送的,而不是网址。请记住,http是无状态协议。解决方案是在路由中留下get :search并使用GET方法发送表单,因此参数将作为网址的一部分发送。