0

这个应用程序有 2 个模型,一个 Farm has_many Crops。我们正在尝试使用 ransack 在 Farm#show 上进行搜索。控制器中的显示操作如下所示:

  def show
    @farm = Farm.find(params[:id])
    @q = @farm.crops.ransack(params[:q])
    @crops = @q.result(distinct: true)
  end

Farm#show 视图包含以下表单:

<%= search_form_for @q do |f| %>
  <div>
    <%= f.label :croptype_cont, "Crop Name Contains:" %>
    <%= f.text_field :croptype_cont %>
  </div>
<%= f.submit "search" %>
<% end %>

一切对我来说都是正确的,但我们不断收到此错误 - 它突出显示了搜索表单的第一行:

农场中的 NoMethodError#show
未定义的方法 `crops_path'

这里缺少什么?

4

1 回答 1

0

因为在默认情况下,rankack 搜索会进行索引操作,您可以在其文档中看到crops_path,这里您必须编写一个单独的搜索操作。或者你可以这样做

1-修改您的显示操作并仅定义@q为搜索变量

  def show
    @farm = Farm.find(params[:id])
    @q = @farm.crops.ransack(params[:q])
  end

2-为搜索创建单独的操作-

def search_crops
  @farm = Farm.find(params[:id])
  @q = @farm.crops.ransack(params[:q])
  @crops = @q.result(distinct: true) 
end 

3- 定义 search_crops 的 url

get 'search/farm/crops', to: 'farms#search_crops', as: :crops_search

4-在搜索与农场相关的作物之前farms/show.html.erb发送一个隐藏的字段id来获取农场

<%= search_form_for @q, url: crops_search_path, :html => { :method => :get } do |f| 
  <%= f.hidden_field :id, value: params[:id] %>
  <div>
    <%= f.label :croptype_cont, "Crop Name Contains:" %>
    <%= f.text_field :croptype_cont %>
  </div>
<%= f.submit "search" %>
<% end %>

5-因此在@cropssearch_crops操作中获取后,您可以制作通用部分show.html.erb以及search_crops.html.erb 显示搜索结果。您可以相应地修改您的代码

于 2017-10-20T06:12:38.440 回答