【问题标题】:Where is RoR defining objects it creates when you run rails generate scaffold without a database?当您在没有数据库的情况下运行 rails generate scaffold 时,RoR 在哪里定义它创建的对象?
【发布时间】:2019-02-25 16:31:48
【问题描述】:

我正在尝试构建一个 Ruby On Rails 应用程序,该应用程序将允许监视和控制多个 Web 服务。我目前正在运行这些服务,并且能够在列出服务及其状态的控制台应用程序中查看每个服务的“状态”,即。

Service1 Running
Service2 Paused
Service3 Waiting on Files

我想,我希望 RoR 应用程序将这些响应收集到一个名为 Process 的 PORO 对象集合和集合 Processes 中。然后我希望默认路由打开视图“process_list.html.erb”,其中将在加载时使用 jQuery 页面来创建将从该进程集合中填充的 DataTable“process_table”。我的问题是,虽然我喜欢 RoR 应用程序的结构,但我不了解 RoR 应用程序中的控制流程。如果我在 jQuery 和 javascript 页面中编写此内容,我会知道我的 index.jsp 页面将包含 jQuery DataTable javascript 链接,该链接将在加载页面时执行。这将引用另一个 javascript 函数,该函数将调用 Web 服务、收集响应、将其转换为 JSON 数组并将其返回到 DataTable,在那里它将呈现为表格。我可以有一个计时器来定期刷新页面等。虽然它可以工作,而且我之前已经构建过,但它似乎比适当的 RoR 应用程序更不“有条理”。

这是我到目前为止所采取的步骤:

1) rails new maestro -O

2) cd 大师

3) rails 生成脚手架进程展示

4) 在 routes.rb 中我添加了:

  resources :processes, :only => [:show]
  root 'processes#show'

这应该带我到 apps/views/processes/show.html.erb 页面,我认为我可以以某种方式提供一个 javascript 页面,该页面将在加载时执行以创建 PORO 对象并将它们返回给 DataTables一个数组,可以通过将 process.name、process.status 提取到表中的 foreach 循环来处理。但是,我收到一个错误,在 app/controllers/process_controller.rb 中有一个部分:

def set_process
  @process = Process.find(params[:id])
end

并且没有为 Process 定义“查找”。现在,我在任何地方都找不到“进程”类,也不知道这是什么或为什么要调用它。索引方法中有对@process = Process.all 的引用。同样,我在哪里定义这些?

上面显示的步骤是开始构建此类应用程序的正确方法吗?如果是,我应该如何创建或编辑 Process 类并添加这些方法?我在哪里放置此页面的 javascript?一些关于在哪里查看、阅读什么以便我能够理解 RoR 应用程序流程的指针将不胜感激。

【问题讨论】:

  • 注意:Ruby 并不像 Java 那样拥有任何“普通的 Ruby 对象”。在 Ruby 中,我们只调用这些类。
  • 如果您使用的是当前版本的 Rails,您将可以访问 ActionCable,这可以减少实时刷新的麻烦。
  • 您是否生成了process 模型?如果没有,请rails g model process 填补空白。
  • 我会调查 ActionCable。我尝试了 rails g 模型进程,它打印出:Running via Spring preloader in process 46121 但似乎没有任何改变。 Process:Module 的相同错误未定义方法“全部”。
  • @JohnWooten 您应该避免使用 ruby​​ 的核心类/模块的名称来命名您的自定义类/模块。例如。 ruby 的核心中已经有Process 模块。否则,这可能会导致意外行为。

标签: javascript jquery ruby-on-rails ruby


【解决方案1】:

Rails 脚手架做了很多假设,期望控制器操作的约定与数据库模型/表相对应。正如其他人所提到的,你应该避免使用Process,因为它是一个核心 ruby​​ 模块,而不是我建议MonitorProcess

如果您想使用数据库模型来存储有关流程的内容,那么您需要一个模型 (rails g model monitor_process) 并供您的控制器使用

rails generate scaffold monitor_processes

然而,这将构建标准 MVC 设置,用于创建数据库表的迁移、模型类 MonitorProcess、具有 RESTful 路由(索引、显示、新建、创建、更新和销毁)的控制器,以及用于索引、显示、新建、编辑和用于新建和编辑的表单部分,以及用于编写测试的文件设置。

如果您不需要访问数据库模型,您可以从控制器中删除它们,或者将它们注释掉。但是这就是你偏离了 MVC 的道路。

before_action :set_monitor_process, only: [:show, :edit, :update, :destroy]

def set_process
  @mocel_process = ModelProcess.find(params[:id])
end

从这里您可以考虑使用动作电缆并在该页面上使用您想要的自定义 js。但是你甚至需要这个应用程序的导轨吗?听起来它可能比您需要的开销更大。 Scaffold 是一个工具,它使基本数据驱动应用程序的快速原型制作变得非常快速和容易。但它附带了许多您的用例可能不需要的约定。

但是,如果不确切知道您想要创建/监控哪些 Web 服务以及如何创建/监控,很难说您是否应该使用 Rails。它当然可以用来做 Scaffold 为您设置的功能之外的许多事情。这只是为了快速进行基本设置并避免大量样板文件。有很多框架可以做后台作业等。但问题是,你需要 MVC 吗?如果没有,那么您肯定还有其他选择。如果您只需要一个带有解耦前端的后端,您可以查看Using Rails for API-only Applications 如果你喜欢使用 Ruby,Sinatra 可能是look into 的另一个选择。

【讨论】:

  • 这是我得到的印象,RoR 是针对数据库使用的。我想我会使用我以前的 JavaScript 方法,因为我知道我可以从那里使用 Web 服务。
  • Rails 是开箱即用的,并且是 MVC 架构,因此除非您了解并需要这种模式,否则您可能需要考虑替代方案。查看更新的答案。
  • 再次感谢。我通常尝试使用 MVC 架构,因为我喜欢这种分离。我试图使用 RoR,因为它“正式化”了它,提供模板、身份验证,并创建了非常好的基于数据库的网站。请您扩展您的“离开 MVC 路径的地方”。您的意思是我应该生成 rails,然后在 monitor_process 控制器中进行您建议的更改吗?他们是做什么的?
  • 我建议花时间在guides.rubyonrails.org 那里做的解释比我做得更好。在这种情况下,before_action 将在安静的路由 only: [:show, :edit, :update, :destroy] 上被调用。例如,如果在 show 操作中没有传递任何参数,您将收到错误消息。
猜你喜欢
  • 1970-01-01
  • 2011-05-19
  • 2011-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-24
  • 2021-10-12
  • 1970-01-01
相关资源
最近更新 更多