0

我有一个关于控制器操作之间代码重用的问题。我认为这是一个相当标准的情况,所以我对 Rails 的最佳实践很感兴趣。

假设我有一个films具有相应 的资源,该资源具有由FilmsController提供的嵌套资源。嵌套资源可以使用其和操作自行呈现。但是,也应该可以渲染嵌入在相应电影页面中的评论。commentsCommentsControllerindexshow

现在,问题来了,从CommentsController内部重用代码的最佳方法是什么FilmsController.show

1)强制CommentsController.index渲染为字符串,然后将其以变量形式传递给电影视图?

或者2)CommentsController.index直接在电影视图中调用作为一种“部分”,从那里执行数据库查询?

或者3)创建一个CommentsController负责数据库处理的单独方法,从两者调用它,CommentsController.indexFilmsController.show在这两个地方使用相应的视图?

对我来说,选项 1) 和 2) 似乎有点混乱,而 3) 不是模块化的,并且涉及一些代码重复。有没有更好的方法来实现这一点?

非常感谢!

4

1 回答 1

0

现在,问题来了,在 FilmsController.show 中重用 CommentsController 代码的最佳方法是什么?

您可以将共享控制器逻辑移动到应用程序控制器内部(或 lib 并适当地要求它),例如:

class ApplicationController < ActionController::Base

  def foo
    @foo = "foo"
  end

end

评论控制器:

class CommentsController < ApplicationController

  before_filter :foo, :only => [:index]

  def index    
  end

end

电影控制器:

class FilmsController < ApplicationController

  before_filter :foo, :only => [:show]

  def show
  end

end

对于重复的视图逻辑,您可以将其移动到一个公共文件夹中,your_app/app/views/shared/_foo.html.erb并适当地进行渲染。


另一种选择是将相关代码放入外部模块中:

lib/mymodule.rb

module MyModule
  def foo
  end
end

然后您可以将模块包含在您的控制器中或您想要访问您的foo方法的任何地方。

class CommentsController < ApplicationController
  include MyModule

    def index
      foo()
    end

end
于 2013-01-23T20:02:02.657 回答