【问题标题】:Ruby on Rails folder structure with helpers带有助手的 Ruby on Rails 文件夹结构
【发布时间】: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


【解决方案1】:

如果需要,您可以在控制器中包含模块并访问方法。喜欢:

include HelperModuleName

【讨论】:

  • 这样做后,我无法使用助手中的方法。我得到的错误是“NoMethodError(FeatureManagementHelper 的未定义方法 `get_feature_list'”。我尝试过以这种方式访问​​该方法:HelperModuleName.HelperModuleMethod
  • 包含模块后,可以直接调用get_feature_list方法。您不必在它前面加上您的模块名称。
【解决方案2】:

坦率地说,在我看来,您似乎只是想在这里“过关” Rails,并在 Rails 环境中使用其他范例。我认为从长远(甚至短期)来看,您不会对此感到满意。如果你以这种方式使用 Rails,它只会妨碍你。

首先,我永远不会以这种方式使用助手。在我看来,助手只是为了从视图模板中删除“愚蠢”的代码,以减少 HTML'ish/JSON'ish 模板中的“编程”混乱。而且它们绝对不是领域方法。他们做与领域无关的事情,比如渲染表单元素、复杂的表格或类似的事情。

仅仅因为您不输出 HTML 而是 JSON 并不意味着您必须完全放弃 MVC 范例,就像您正在做的那样。有JSON模板,见In Rails, how do you render JSON using a view?

您正在使用帮助程序加载配置。配置位于 config/application.rbconfig/environments/*.rbconfig/initializers/*.rb 等中 - 请参阅 http://guides.rubyonrails.org/configuring.html。您永远不需要在帮助程序中加载 YAML。

您的控制器代码建议您不要使用 routes.rb 来构建您的请求。像你在控制器中那样分支对我来说是一种很大的气味。见http://guides.rubyonrails.org/routing.html

也许不是您正在寻找的答案,但那是我的 2 欧元。 :)

【讨论】:

  • 嘿,非常感谢您的帮助。我已经按照您的链接更新了问题。只是想知道这是否是正确的方法。
  • 看起来你走上了正轨。 :) 在 Rails 中几乎没有什么是绝对必须做的,但如果你尊重他们的基本设计/文件布局,你往往更有可能真正从中受益。
猜你喜欢
  • 2015-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-05
  • 2015-07-01
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
相关资源
最近更新 更多