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 应用程序中使用排除项设置路由吗?