Ruby on Rails控制器中可访问常量的存放位置咨询
问题描述
我正在使用ruby-2.5.0与Rails 5开发Ruby on Rails项目,已编写一个API用于检查哈希中是否存在特定词汇,代码如下(parser_controller.rb):
# frozen_string_literal: true class ParserController < ApplicationController def create search_words = ["Walmart","Optical","Anker"] if search_words.select{|w| parser_params.to_s.include?(w) } render json: {}, status: 200 else render json: {}, status: 404 end rescue StandardError render json: {}, status: 500 end private def parser_params # 此处为参数强过滤逻辑(用户代码未完整展示) params.permit(...) end end
现需将search_words定义为常量,请问应将其放置在何处才能让控制器正常访问?
解决方案
嘿,根据你的需求,有几个不同的放置位置可选,对应不同的使用场景,我给你逐一说明:
1. 控制器类内部(仅当前控制器使用)
如果这个常量只在ParserController里用到,直接把它定义在控制器顶部就好,这是最直接的方式:
# frozen_string_literal: true class ParserController < ApplicationController # 定义为常量并冻结,避免意外修改 SEARCH_WORDS = ["Walmart","Optical","Anker"].freeze def create # 这里建议用any?替代select,因为只需要判断是否存在匹配项,更高效 if SEARCH_WORDS.any? { |w| parser_params.to_s.include?(w) } render json: {}, status: 200 else render json: {}, status: 404 end rescue StandardError render json: {}, status: 500 end private def parser_params params.permit(...) end end
2. Rails全局配置(多模块共享)
如果这个常量需要在多个控制器、模型或者其他模块里共享,可以把它放到config/application.rb里作为全局配置:
# config/application.rb module YourAppName class Application < Rails::Application # 配置全局可访问的搜索词常量 config.search_words = ["Walmart","Optical","Anker"].freeze end end
之后在控制器里这样访问:
if Rails.application.config.search_words.any? { |w| parser_params.to_s.include?(w) } # 业务逻辑 end
3. 独立常量文件(批量管理常量)
如果你的项目里有很多这类业务相关的常量,建议专门建一个常量目录来管理。比如在app/constants下创建search_constants.rb:
# app/constants/search_constants.rb module SearchConstants SEARCH_WORDS = ["Walmart","Optical","Anker"].freeze end
然后在控制器里引入这个模块就能直接用常量了:
# frozen_string_literal: true class ParserController < ApplicationController include SearchConstants def create if SEARCH_WORDS.any? { |w| parser_params.to_s.include?(w) } # 业务逻辑 end end end
这种方式能让常量管理更有条理,后续新增或修改也更方便。
4. 关联业务模型(和模型业务绑定)
如果这些搜索词和某个业务模型强相关(比如是产品相关的关键词),那把常量定义在对应模型里更合理:
# app/models/product.rb class Product < ApplicationRecord SEARCH_WORDS = ["Walmart","Optical","Anker"].freeze end
之后在控制器里通过Product::SEARCH_WORDS访问即可。
内容的提问来源于stack exchange,提问作者awsm sid
相关产品推荐
相关产品推荐

