Rails 5控制器中基于pg_search查询字符串设置布局
正确实现根据pg_search查询字符串动态设置布局的方法
嘿,我帮你修正这个布局设置的问题~ 你原来的代码里有个关键错误:直接用符号:query调用include?是行不通的,得用实际的请求参数值params[:query]才行。另外咱们也得考虑一些边界情况,比如空查询字符串的处理,避免报错。
下面是修正后的products_controller.rb的index方法:
def index if params[:query].present? # 忽略大小写匹配'limestone',让用户输入更灵活 if params[:query].downcase.include?('limestone') layout 'product-index-limestone' else # 其他查询用默认布局(也可以换成你需要的其他布局) layout 'product-index-default' end @products = Product.search_for(params[:query]) else # 没有查询参数时,加载所有产品(或者你的其他默认逻辑) @products = Product.all # 这里可以省略layout设置,会用全局默认布局 end end
补充说明:
- 用
params[:query].present?替代单纯的if params[:query]:这样能正确处理用户传入空字符串的情况,避免出现NoMethodError。 - 加上
downcase:让匹配不区分大小写,比如用户输入"Limestone"或者"LIMESTONE"都能触发对应的布局,如果你需要严格区分大小写,去掉downcase就行。 - 多关键词场景扩展:如果以后要加更多关键词对应不同布局,用
case语句会更清晰:
def index if params[:query].present? case params[:query].downcase when /limestone/ layout 'product-index-limestone' when /granite/ layout 'product-index-granite' when /marble/ layout 'product-index-marble' else layout 'product-index-default' end @products = Product.search_for(params[:query]) else @products = Product.all end end
如果你的逻辑比较简单,还可以用三元表达式让代码更简洁:
def index if params[:query].present? layout params[:query].downcase.include?('limestone') ? 'product-index-limestone' : 'product-index-default' @products = Product.search_for(params[:query]) else @products = Product.all end end
内容的提问来源于stack exchange,提问作者Charles Smith
相关产品推荐
相关产品推荐

