这个应用程序有2个模型,一个农场has_many作物。我们正在尝试使用ransack在Farm#show上进行搜索。控制器中的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&#39;
这里缺少什么?
答案 0 :(得分:0)
因为默认情况下,rankack搜索会转到索引操作,您可以在其文档中看到crops_path
,此处您必须编写单独的搜索操作。或者你可以这样做
1-修改您的节目操作并仅将@q
定义为搜索变量
def show
@farm = Farm.find(params[:id])
@q = @farm.crops.ransack(params[:q])
end
2-为搜索创建单独的操作ex-
def search_crops
@farm = Farm.find(params[:id])
@q = @farm.crops.ransack(params[:q])
@crops = @q.result(distinct: true)
end
为search_crops定义网址
get 'search/farm/crops', to: 'farms#search_crops', as: :crops_search
4 in 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 %>
从@crops
行动中获取search_crops
之后 5-所以您可以为show.html.erb
以及search_crops.html.erb
制作公共部分
并显示搜索结果。您可以相应地修改您的代码