我是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>
答案 0 :(得分:0)
if !params[:case_size] == "26-35 mm".nil? ? true : false
为了展示你在做什么,我将代码破解为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)。
但是你甚至没有把它当作一个守卫而且你没有将结果存储在任何变量中。所以我很确定,这里的意图是测试一些事情,之后你忘了清理。它看起来更类似于您想要在视图中检查单选按钮或类似的代码。
@products = @products.where("brand ILIKE '%#{params[:search_brand]}%'")
请不要做同样的事情。你在这里打开SQl注射。我想你想要类似的东西:@products = @products.where('brand LIKE ?', "%#{params[:search_brand]}%")
这样rails可以确保防止sql注入!
if params[:search_case] == "all"
@products = @products.where(case_size: 0..Float::INFINITY)
end
这看起来毫无用处。您只是过滤掉负的case_size。我认为你应该验证,case_size永远不会消极。你不需要这个条件,因为你想在这里允许所有。
所以最后我假设,你的控制器应该看起来很相似:
@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查询确实是你想要的,那么这有时候非常有助于检查。
我希望我的回答可以帮助您深入了解编码轨道。虽然我看到更多可能进一步改进代码。