【问题标题】:Share Controller Actions / Objects on Rails在 Rails 上共享控制器操作/对象
【发布时间】:2020-04-05 18:29:53
【问题描述】:

作为一名 Rails 新手,我想知道重用与数​​据库对象交互的代码的正确方法是什么。例如我有:

class PostsController < ApplicationController
  before_action :set_post, only: [:show, :edit, :update, :destroy]

  def index
    @posts = Post.all
  end

end

我还有一个带有 Welcome 控制器的 Welcome 页面:

class WelcomeController < ApplicationController
  def index
    @posts = Post.all
  end
end

我还想在欢迎页面上显示相同的帖子列表。我为 Posts 实现了一个局部视图并在 Welcome 视图中使用它,但是在 Welcome 控制器上重复相同的数据库查询似乎是错误的方法,因为我在重复自己。

我也像这样调用了其他控制器动作,但我不知道这是否可以接受。

class WelcomeController < ApplicationController
  def index
    @posts = PostsController.new.index
  end
end

我想知道是否有正确的方式(rails 方式)在控制器之间共享操作。本质上来自WelcomeController 调用index PostsController 的动作,所以我不必实现重复该方法

【问题讨论】:

  • 像这样初始化控制器是行不通的。控制器本质上是 Rack 应用程序,因此您需要将包含请求上下文的 env 哈希传递给初始化程序。这也很像该方法不会返回@posts 的值。它将返回执行隐式渲染的结果,这是一个响应对象。

标签: ruby-on-rails ruby model controller action


【解决方案1】:

好问题!

这可能看起来重复太多,但在控制器中重复数据库查询是完全可以的。不要实例化一个新的控制器实例,然后像你一样调用它的 index 方法。

请记住,HTTP 请求被路由到正确的控制器操作,然后呈现视图。因此,将相同的视图重构为部分视图并渲染它们是非常好的,但不要担心控制器中的重复代码,特别是如果它只是一个简单的查询。

一旦您的应用发展壮大,您将在控制器中拥有更多代码,并且看起来不会有太多重复。 如果您有较大的重复代码块,您可以处理关注点(How to use concerns in Rails 4 它们也适用于模型)。

【讨论】:

  • 非常感谢克拉拉!这让我明白了。
猜你喜欢
  • 1970-01-01
  • 2014-06-03
  • 2012-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-19
  • 1970-01-01
  • 2013-05-12
相关资源
最近更新 更多