带有帮助程序的Ruby on Rails文件夹结构

时间:2016-01-14 06:46:36

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-4

我必须只创建一个rails API,即输入是POST请求,输出将是JSON响应。我必须使用自己的表名与mysql数据库进行交互,即已经创建了mysql表。 下面是" helpers"的文件夹结构。即使我们没有使用任何"观点"。我们正在从控制器访问辅助方法。请确认我是否正确。提前谢谢。

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

我们正在使用&#34; class&#34;帮助者内部的关键词。但在搜索时,似乎&#34;模块&#34;关键词是必要的。但我们无法找到在控制器内访问辅助模块方法的方法。

感谢任何帮助。谢谢!!!

更新

@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

同样适用于任何控制器&#34; test_controller&#34;我有一个名为&#34; test_controller&#34;的文件夹。在位置/ app / controllers / 我将业务逻辑保存在这个&#34; test_controller&#34;中的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):

我想知道这是否是正确的方法,并且有更好的方法。

欣赏您的输入.. !!!

2 个答案:

答案 0 :(得分:0)

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

include HelperModuleName

答案 1 :(得分:0)

坦率地说,对我来说,似乎你正试图“勉强”#34;这里使用Rails并在Rails环境中使用其他范例。我不认为你会在漫长(甚至短暂)的任期内对此表示满意。如果你以这种方式使用Rails,它就会妨碍你。

首先,我根本不会以这种方式使用助手。在我看来,帮助者只是为了削减&#34;愚蠢的&#34;来自视图模板的代码,以减少&#34;编程&#34;内部混乱,否则HTML&#39; ish / JSON&#39; 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欧元。 :)