如何检查从一个参数到另一个参数的过滤参数?

时间:2018-03-28 02:40:42

标签: angularjs ruby ruby-on-rails-3

我是Ruby on Rails的新手,我正在尝试使用Angular为页面创建一个小过滤器。但是,我有一个问题是检查以下品牌阵列中是否存在26-35mm。因此,如果我将品牌名称从All更改为G-shock,我会尝试检查以下过滤器中的:case_size是否在26到35毫米之间,如果它不可用,则禁用单选按钮。

我的产品控制器

if params[:search_brand] == "all"
  @products = @products.order('created_at ASC')
elsif params[:search_brand].present?
  @products = @products.where("brand ILIKE '%#{params[:search_brand]}%'")
  if !params[:case_size] == "26-35 mm".nil? ? true : false
end
if params[:search_case] == "all"
  @products = @products.where(case_size: 0..Float::INFINITY)
end
if params[:search_case] == "26-35 mm"
  @products = @products.where(case_size: 26..35)
end

例如:

我的过滤器中有一系列品牌,有一个单选按钮选项可供选择

<% @brands.each do |item| %>
  <%= radio_button_tag :search_brand,
                       item.parameterize.underscore,
                       params[:search_brand] == item.parameterize.underscore ? true : false,
                       :onchange => "window.location.assign(selectBrand(window.location, escape(this.value)));" %>
  <%= label :search_brand,
            item.parameterize.underscore %>
<% end %>

这是代码的第二部分

<%= radio_button_tag :search_case,
                     "All".parameterize.underscore,
                     true,
                     :onchange => "window.location.assign(selectCase(window.location, escape(this.value)));" %>
<%= label :search_case,
          "All".parameterize.underscore,
          class: 'menu_item__block_item' %>
<%= radio_button_tag :search_case,
                     '26-35 mm',
                     params[:search_case] == '26-35 mm' ? true : false,
                     :onchange => "window.location.assign(selectCase(window.location, escape(this.value)));" %>
<%= label :search_case,
          '26-35 mm',
          class: 'menu_item__block_item', for: "search_case_26-35_mm" %>

我更改过滤器选项时过滤产品的脚本将添加网址

<script type="text/javascript">
function selectBrand(path, brand) {
    var p = path.toString();

    p = p.replace(/&search_brand=.+/, "");

    if (p.search("\\?") == -1) {
        p = p + "?";
    }

    p = p + "&search_brand=" + brand;

    return p;
}
function selectCase(path, caseSize) {
   var p = path.toString();

   p = p.replace(/&search_case=.+/, "");

   if (p.search("\\?") == -1) {
     p = p + "?";
   }

   p = p + "&search_case=" + caseSize;

   return p;
}
</script>

1 个答案:

答案 0 :(得分:0)

  1. 奇怪的代码行:if !params[:case_size] == "26-35 mm".nil? ? true : false
  2. 为了展示你在做什么,我将代码破解为irb:

    2.5.0 :001 > params = {case_size: '26-35 mm'}
    => {:case_size=>"26-35 mm"}
    2.5.0 :002 > puts 'yes' if !params[:case_size] == "26-35 mm".nil? ? true : false
    yes
    => nil
    2.5.0 :003 > params = {case_size: 'all'}
    => {:case_size=>"all"}
    2.5.0 :004 > puts 'yes' if !params[:case_size] == "26-35 mm".nil? ? true : false
    yes
    => nil
    2.5.0 :005 > params = {case_size: nil}
    => {:case_size=>nil}
    2.5.0 :006 > puts 'yes' if !params[:case_size] == "26-35 mm".nil? ? true : false
    => nil
    

    为了让您更多地了解代码:!params[:case_size] == "26-35 mm".nil? ? true : false您可以替换为:!params[:case_size] == false ? true : false(因为静态字符串永远不会为nil)您可以替换为:params[:case_size] ? true : false甚至是冗余,因为params [:case_size]在每种情况下都已经充当了真理,它不是零或假。因此,您只需要以非常复杂的方式测试params [:case_size]是否为nil(或false)。   但是你甚至没有把它当作一个守卫而且你没有将结果存储在任何变量中。所以我很确定,这里的意图是测试一些事情,之后你忘了清理。它看起来更类似于您想要在视图中检查单选按钮或类似的代码。

    1. @products = @products.where("brand ILIKE '%#{params[:search_brand]}%'")

      请不要做同样的事情。你在这里打开SQl注射。我想你想要类似的东西:@products = @products.where('brand LIKE ?', "%#{params[:search_brand]}%") 这样rails可以确保防止sql注入!

    2. if params[:search_case] == "all" @products = @products.where(case_size: 0..Float::INFINITY) end 这看起来毫无用处。您只是过滤掉负的case_size。我认为你应该验证,case_size永远不会消极。你不需要这个条件,因为你想在这里允许所有。

    3. 所以最后我假设,你的控制器应该看起来很相似:

      @products = @products.order('created_at ASC')
      if params[:search_brand].present?
        @products = @products.where('brand LIKE ?',"%#{params[:search_brand]}%")
      end
      if params[:search_case] == "26-35 mm"
        @products = @products.where(case_size: 26..35)
      end
      

      如果您现在想要检查,如果sql是正确的 - 包括pry或类似的东西,请在此行后面设置binding.pry并检查:

      @products.to_sql
      

      然后你会得到类似的东西:`“SELECT \”products \“。* FROM \”products \“WHERE \”products \“。\”case_size \“BETWEEN'26'和'35')ORDER BY created_at ASC” 如果sql查询确实是你想要的,那么这有时候非常有助于检查。

      我希望我的回答可以帮助您深入了解编码轨道。虽然我看到更多可能进一步改进代码。