【问题标题】:search items by category_id with select_tag drop down in rails使用 rails 中的 select_tag 下拉列表按 category_id 搜索项目
【发布时间】:2015-06-17 18:23:00
【问题描述】:

我已经编辑了我的第一个代码,现在由于@FunTimeFreddie,它变得更好、更清晰了,但是它的问题还没有得到妥善解决。我会尽快回复正确答案。

在搜索表单中,我需要过滤所有菜单项: 1. 按类别 2.按类别搜索“查询” 3. 每分钟价格 && ||最高价格 ……等等,所有可能的组合

我已经设法使用“查询”、min_price 和 max_price 搜索所有菜单项——搜索表单中所有可能的组合。我无法获得所选类别的结果列表,我做错了什么?

这是我的模型(已编辑):

class Menuitem < ActiveRecord::Base

belongs_to :menu_category

include Filterable

scope :newest_first, lambda { order('menuitems.created_at DESC') }
scope :last_one, lambda { order('menuitems.created_at ASC').last }

scope :search_keyword, lambda { |query|
    where(["title LIKE ? or body LIKE ?", "%#{query}%", "%#{query}%"]) if query != ""
}

scope :menu_category_id, lambda { |menu_category_id|
    where( "menu_category_id = ?", menu_category_id ) if menu_category_id != ""
}

scope :min_price, lambda { |price|
    where("price > ?", price) if price != ""
}

scope :max_price, lambda { |price|
    where("price < ?", price) if price != ""
}
end

这是我的控制器(已编辑):

class MenuitemsController < ApplicationController
def index
@menuitems = Menuitem.newest_first.filter(params.slice(:menu_category_id, :search_keyword, :min_price, :max_price))
end

这是我的观点:

<%= simple_form_for :menuitem, :method => 'get', :url => {:action => 'index'} do |f| %>
            <p>
                <%= f.select :menu_category_id, options_for_select(@menucategories.map {|s| [s.title, s.id]}, params[:menu_category_id]), :selected => params[:menu_category_id], :onchange => "this.form.submit();", prompt: "Select category" %>
            </p>
            <p>
            <%= f.input :search_keyword, input_html: { name: 'search_keyword', :value => params[:search_keyword]}, label: 'search recipe title', :required => false %>
            <%= f.input :min_price, input_html: { name: 'min_price', :value => params[:min_price]}, label: 'min price:', :required => false %>
            <%= f.input :max_price, input_html: { name: 'max_price', :value => params[:max_price]}, label: 'max price:', :required => false %>
            <%= f.button :submit, "search" %>
          </p>
        <% end %>

【问题讨论】:

  • 作为调试方法,将您的 select 语句中的模型替换为一组虚拟文本,例如 ["Fred", "Wilma", "Barney", "Betty"]。如果这可行,您的问题是您的模型没有返回文本数组。如果它不起作用,则您的 f.select 已损坏并且需要工作,直到虚拟数组起作用。像@FunTimeFreddies 这样的 FWIW 增加答案是识别有用答案的方法。
  • 这是一个很好的建议@Matt Stevens,我要试试。我已经看到 url 显示了查询,所以我认为它应该是我的控制器或模型中的问题。关于滴答,你绝对是对的,但我不能什么都不做,因为我没有足够的声誉。 :( 对不起。

标签: ruby-on-rails search scope html-select


【解决方案1】:

您可以通过在范围内添加 IF 语句来为所有组合省去控制器中所有 IF 语句的麻烦。例如,这可以类似地应用于与您的表单关联的四个范围,

# menuitem model
scope :search_keyword, lambda { |query|
    where(["name LIKE ?", "%#{query}%"]) if query != ""
}

这将允许在您的控制器中仅包含一行,即您的第一个 IF 语句下方的行,因为这将处理空白参数。

【讨论】:

  • 这真的很有用,非常感谢@FunTimeFreddie。但我仍然没有让 category_id 工作。这是 URL 中的查询:localhost:3000/menuitems?utf8=✓&menuitem%5Bmenu_category_id%5D=3&search_keyword=first&min_price=11&max_price=50&commit=search
【解决方案2】:

category 参数似乎有两个问题。首先是它是 params[:menuitem] 中的一个嵌套参数,所以为了访问它,我们需要调用 params[:menuitem][:menu_category_id]。老实说,不太清楚为什么会发生这种情况,尽管我建议在这种情况下使用 form_tag 而不是 form_for,因为我们没有添加或编辑 menuitems 表本身。

第二个问题是类别参数作为字符串传递,而我们需要它作为整数。我们需要在应用之前转换为参数。

现在我不熟悉 .filters 方法(这是 gem 的一部分吗?),但我只需将所有范围连接到一行中,就可以按照老式的方式工作,如下所示...

# menuitems controller
  def index
    @menuitems = Menuitem.newest_first.min_price(params[:min_price]).max_price(params[:max_price]).search_keyword(params[:search_keyword]).menu_category_id(params[:menuitem][:menu_category_id].to_i)
  end

请注意,更改数据类型的另一种方法是在范围内进行。你可以这样做

# menuitem model
scope :menu_category_id, lambda { |menu_category_id|
where( "menu_category_id = ?", menu_category_id.to_i ) if menu_category_id != ""

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-14
    • 1970-01-01
    • 1970-01-01
    • 2016-12-06
    • 2021-05-01
    • 1970-01-01
    相关资源
    最近更新 更多