【发布时间】:2016-04-19 09:43:59
【问题描述】:
我只需要制作一个 Rails API,即输入是 POST 请求,输出是 JSON 响应。我必须使用我自己的表名与 mysql 数据库交互,即已经创建了 mysql 表。 下面是带有“助手”的文件夹结构,即使我们没有使用任何“视图”。我们正在从我们的控制器访问辅助方法。请确认我是否正确。提前致谢。
1) app/controllers/application_controller.rb
class ApplicationController < ActionController::API
# Prevent CSRF attacks by raising an exception.
# For APIs, you may want to use :null_session instead.
protect_from_forgery with: :exception
end
2) app/controllers/feature_management_controller.rb
class FeatureManagementController < ApplicationController
def populate_bean
@json = OrionCountryList.new.sample_function
end
def send_response(bean)
helper = FeatureManagementHelper.new
if (bean.method.eql?"get_feature_list") && (!bean.app_key.blank?) && (bean.app_key!=nil) && (bean.app_key.casecmp("NULL")!=0)
logger.info bean.print_bean "Request for fetching featureList by app_key : " + bean.app_key.to_s + " And userID: " + bean.user_id.to_s
@@json_response = helper.get_feature_list bean
else
logger.error "METHOD NOT FOUND. method during feature management :"+bean.method+" app_key :"+bean.app_key
@@json_response = {:message => "API not avaliable"}
end
logger.info("Final json_response sent to app : "+@@json_response.to_json)
render :json => @@json_response
end
end
3) app/helpers/application_helper.rb
class ApplicationHelper
APP_CONFIG = YAML.load(File.read(File.expand_path('../../../config/app_config.yml', __FILE__)))
end
4) app/helpers/feature/feature_management_helper.rb
class FeatureManagementHelper
def get_feature_list(bean)
response = Hash.new
response = {:success_code => "1"}
return response
end
end
这里我们在助手中使用“class”关键字。但是在搜索时,似乎需要“模块”关键字。但是我们找不到在控制器中访问助手模块方法的方法。
任何帮助表示赞赏。谢谢!
更新
@Ekkerhard,感谢您的建议, 我已经避免以上述方式使用助手,而是使用 PORO 来实现我的业务逻辑,正如@spikermann 所建议的那样 this_link
实施更改后,我的代码结构如下所示:
1) app/controllers/feature_management_controller/feature_management.rb
class FeatureManagementController
class FeatureManagement
def get_feature_list(bean)
response = Hash.new
response = {:success_code => "1"}
return response
end
end
end
对于任何控制器“test_controller”类似,我在 /app/controllers/ 位置有一个名为“test_controller”的文件夹 我将业务逻辑保存在这个“test_controller”文件夹内的 test.rb 文件中。
2) 我们在 /app/controllers 中有所有的控制器
3) 我们在 /app/models 中有所有模型
4) 我们正在读取/config/application.rb里面的配置文件
class Application < Rails::Application
config.autoload_paths += Dir["#{config.root}/lib/**/"]
APP_CONFIG = YAML.load(File.read(File.expand_path('app_config.yml', __FILE__)))
config.time_zone = "New Delhi"
config.active_record.default_timezone = :local
config.autoload_paths += Dir["#{config.root}/app/**/"]
end
尽管如果我从 feature_management.rb 文件中读取配置文件,一切正常,即将这一行添加到 feature_management.rb 文件中:
/app/controllers/feature_management_controller/feature_management.rb
APP_CONFIG = YAML.load(File.read(File.expand_path('../../../../config/app_config.yml',
__FILE__)))
但在尝试从 application.rb 文件中读取配置时出现错误:
NameError (uninitialized constant FeatureManagementController::FeatureManagement::APP_CONFIG):
我想知道这是否是正确的方法,是否有更好的方法。
感谢您的投入..!!!
【问题讨论】:
-
您的助手似乎不是 Rails 约定的助手。它们只是可以存在于
app/models(或lib)文件夹中的 PORO。 -
嘿@spickermann,我已经实现了 PORO 并更新了我的问题,你能帮我吗?
标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-4