Ruby on Rails 路由到控制器

Posted

技术标签:

【中文标题】Ruby on Rails 路由到控制器【英文标题】:Ruby on Rails routes to controllers 【发布时间】:2016-03-15 01:30:36 【问题描述】:

据我了解,路线会将您从起点带到控制器和操作。动作会调出相关的视图;那么,如果我的控制器不需要任何视图,只想调用控制器的底层方法,而不渲染视图或路由,该怎么办。

假设我有一个 FoodsController 有几种方法,并且该控制器中存在蛋糕、披萨和薯条的方法。每个人都在数据库中查询一条秘密消息并将其存储在一个变量中,但对此的请求将来自我们应用程序的其他部分。

为了实现这一点,我应该为此使用路由或某种点语法,例如food.cake()

所以我想我想说的是,嘿,“服务器”去做这件事,完成后回到你离开的地方。

【问题讨论】:

检查这个,***.com/questions/14806310/… 【参考方案1】:

控制器仅用于 URL 端点。例如,如果您点击http://my.app/my_route,则需要将my_route 部分映射到routes.rb 文件中的控制器操作。但是如果你在浏览器中输入这个会发生什么?你会想看点什么吗?所以你需要返回一些数据(json、html、erc)。您可以为此使用render

这与编写“普通”Ruby 代码不同,即在 Web 框架之外编写 Ruby。你了解什么是类以及以下是如何工作的吗?

class MyClass
  def initialize
  end
  def my_method
    puts "my_method_called"
  end
end

MyClass.new.my_method # => "my_method_called"

这是非常基本的 Ruby,并且在 Rails 中也可以使用,尽管对于需要在何处编写代码有一些规则。

顺便说一句,如果你真的想制作一个不呈现任何内容的控制器动作,只需使用:

render text: "", status: 204
return false

状态:204 表示“无内容”。

【讨论】:

所以像 PostController.new.create... 调用类。然后是新的类实例,最后是类中的方法? 答案是否定的,但这是个好问题。控制器是一种特殊情况,因为您从不直接实例化它们,所有这些都在您键入 url 时在幕后发生。如果您只想创建一个可以在任何地方使用的辅助方法,您可以将其作为类方法您的一个模型或在config/initializers/ 文件夹中编写一个新的类/模块。 那么,如果我可以在 config/initializers 或模型中创建一个类,那么它们可以从其他地方访问,为什么我们还有控制器。为什么不只创建一个帮助器来执行所有基本 CRUD 方法,并在您想在类中执行其中一种方法时继续传递一个模型 这取决于你在做什么。如果您是数据库支持的 CLI,那么是的,没有理由拥有控制器。但是根据定义,Web 应用程序将具有 HTTP 请求,即,当您使用 URL 请求一些数据时,您希望获取数据。这个“请求=>响应周期”是控制器的目的。关于你的“为什么不做一个帮手”的问题——我看不出有任何理由这样做,但这不是解决 Rails 一些基本缺陷的“灵丹妙药”。无论如何,如果您厌倦了编写 CRUD 控制器,请尝试使用脚手架。【参考方案2】:

可以使用render json或者text,如果方法没有渲染任何东西,我觉得应该是private的。

【讨论】:

好的,所以我想调用一个没有视图的方法,它应该在私有部分中? 如果该方法不呈现值或视图,则将其设为私有,因为它仅在控制器中使用,不用于公共。 如果不想改变view或者action,可以做个ajax返回json。【参考方案3】:

在您的示例中,您可以像这样在另一个控制器中使用 cake 方法:

cake = Food.cake

请注意,此方法应该存在于食物模型中而不是控制器中,因为您不需要视图。

【讨论】:

Food部分是调用模型还是控制器?我的印象是您需要调用控制器复数和模型单数。

以上是关于Ruby on Rails 路由到控制器的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Ruby on Rails 中创建一个包罗万象的路由?

Ruby on Rails——静态页面的独立控制器方法

ruby on rails 中的控制器和动作有啥区别?

我可以通过资源方法在 Ruby on Rails 应用程序中使用排除项设置路由吗?

了解 Ruby on Rails 6 中的路由 + 模块/类名称 [以及在此上下文中模块是啥]

Ruby on Rails:将数组的 javascript 数组发送到 ruby​​ 控制器