调用集合路径会不断传递ID

时间:2016-04-14 02:28:59

标签: ruby-on-rails ruby activerecord

我正在写一个rails应用程序中的搜索方法。这是一段摘录。

目的是使用正则表达式匹配所有具有与搜索查询匹配的描述的项目。然后,所有匹配的项ID都作为字符串传递给另一个页面。 (这一切都发生在搜索控制器中)。

然后,项目控制器捕获该ID字符串,将它们拆分为数组并显示匹配对象的列表。

我当前遇到了一个问题,即rails将redirect_to语句附加到另一个参数(根据跟踪是{“id”=>“search”},然后搜索ID为“的项目” :a1“。显然找不到一个(ids都是数字),因此应用程序崩溃。任何人都可以解决为什么会这样吗?

在搜索控制器中

rquery = Regexp.new(Regexp.escape(@query), Regexp::IGNORECASE)
item_list = []
Item.all.each{|item| item_list << item if rquery.match(item.shortdescr)} 

unless item_list == nil
    ids = ""

    maybe_matters.each do |matter|
        ids += item.id.to_s + " "
    end

    redirect_to search_items_path(ids: ids)
    return
end

在项目控制器中

def search
    authorize! :show, Item
    @id = params[:ids].split
    @search = []
    @id.each do |id|
      @search << id.to_i
    end

    @items = Item.accessible_by(current_ability).where(id: @search).order('completed desc nulls last').page params[:page]
end

修改

如果它是相关的,这是路径文件的一个(非常小的)部分:

resources :items, only: [:index, :show] do
    collection do
        post :search
    end
end

1 个答案:

答案 0 :(得分:1)

我建议search提出GET请求。确保该操作的路径是routes.rb中的集合操作。如果您的控制器名为ItemsController

resources :items do
  get 'search', on: :collection
end

您可以将搜索参数作为网址参数传递:

GET /items/search?query=searchterm

修改

刚刚在您的路线中实现了POST。您无法重定向到POST路径,这可能是您获得奇怪行为的原因。将搜索操作更改为GET,问题至少会得到部分解决。

另外,您如何处理URL编码?包含空格的字符会被编码为奇怪的值,例如%20,这可能会在您调用params[:ids].split之类的内容时看到意外的结果。

如果可能的话,我建议将其整合到单个控制器操作中,而不是重定向。