所以,我能够发布一个帖子请求并查看搜索结果,但是当我点击刷新时,我收到了一个错误的获取请求错误。
所以,基本上,我无法获取我的搜索结果,但我可以发布我的搜索结果。我怎么能做到这一点?
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
答案 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
更好地了解这一点
我们使用此设置:
#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 /path
和GET /path
。在您的情况下,您已定义get
和post
路由,或仅定义用户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
方法发送表单,因此参数将作为网址的一部分发送。