如果有人能看到我做错了什么就会喜欢它。遵循文档:https://github.com/activerecord-hackery/ransack
我的模型定义了Signup has_many Inventories
控制器代码:
def index
@q = Inventory.search(params[:q])
@inventories = @q.result.includes(:signup)
end
查看代码:
<%= search_form_for @q, url: url_for(controller: 'inventories', action: 'index') do |f| %>
<%= f.label :item_name_cont %>
<%= f.search_field :item_name_cont %>
<%= f.label :signup_email_cont %>
<%= f.search_field :signup_email_cont %>
<%= f.submit %>
<% end %>
<table>
<thead>
<tr>
<th><%= sort_link(@q, :item_name, "Item", default_order: :desc) %></th>
<th><%= sort_link(@q, 'signups.email', "Email") %></th>
<th>Action</th>
<th colspan="5"></th>
</tr>
</thead>
<tbody>
<% Inventory.all.each do |inventory| %>
<tr>
<td><%= inventory.item_name %></td>
<td><%= inventory.signup.email %> %></td>
</tr>
</tbody>
</table>
另外,如果它有用,如果我在搜索表单中删除url:
规范,则会收到错误消息:No route matches [GET] "/inventories/search"
答案 0 :(得分:0)
改变这一点;
def index
@q = Inventory.search(params[:q])
@inventories = @q.result.includes(:signup)
end
到
def index
@q = Inventory.ransack(params[:q])
@inventories = @q.result.includes(:signup)
end
答案 1 :(得分:0)
更好的选择
请确保您发布的观看代码位于views/inventories/index.html.erb
文件中,并将Inventory.all.each
更改为@inventories.each
。然后,您就可以访问http://localhost:3000/inventories
的搜索表单。
或强>
根据您提到的错误,您似乎是在/inventories/search
页面上执行此操作。如果您想坚持使用该URL,请将您的index
方法代码移动到控制器中的search
方法中(如下所示),并在路径文件中添加带有GET的search
路由。
def search @q = Inventory.search(params[:q]) @inventories = @q.result.includes(:signup) end
答案 2 :(得分:0)
我想我陷入了同样的境地。它可能正在发挥作用,这很难识别。你得到任何回报吗?可能所有的回报?如果是这种情况,则可能是默认搜索的问题。如果您刚刚放置Inventory.all
尝试,默认搜索会返回您所期望的所有内容。
Inventory.ransack(name_eq: 'potatos').result
这也可行
Inventory.ransack(special_potato_eq: 'potatoes').result
这会将回复限制为Inventory.potato
或Inventory.special_potato
这是对我有用的代码的确切位置
@q = User.ransack(email_eq: params[:q][:email])
查看其他搜索选项的参考链接。
参考:https://github.com/activerecord-hackery/ransack/wiki/basic-searching