【问题标题】:Having multiple instance variables in rails controller action? (Rails best practices)在 Rails 控制器操作中有多个实例变量? (Rails 最佳实践)
【发布时间】:2015-04-02 02:53:51
【问题描述】:

例如,我有两个模型,帖子和类别。现在说我想从类别显示页面中使用 form_for 方法创建一个新帖子。为此,您显然需要访问@category 变量和一个新的帖子实例(@post)。这是控制器中可接受的代码吗?

#app/controllers/categories_controller.rb
def show
  @category = Category.find(params[:id])
  @post = Post.new
end

或者在一个控制器操作中定义两个实例变量是不好的做法 - 如果是,对于这种情况,最佳做法是什么?

【问题讨论】:

  • PostCategory 有什么关系?你也能证明一下吗?

标签: ruby-on-rails


【解决方案1】:

我通常会这样做:

#app/controllers/categories_controller.rb

helper_method :category
helper_method :post

def show
end

private

def category
  @_category ||= params[:id] ? Category.find(params[:id]) : Category.new(params[:category])
end

def post
  @_post ||= Post.new(params[:post])
end

那么,在您看来,只需参考postcategory(而不是@post@_post)。好消息是您可以从 new、delete 等方法中删除相同的逻辑...

【讨论】:

    【解决方案2】:

    与帖子相关的操作应尽可能在 PostsController 中。

    假设用户正在查看“rails”类别下的所有帖子:/categories/rails

    该页面上有一个按钮可以在“rails”类别下创建新帖子,href:/posts/new?category=rails

    这会将您带到PostsController#new,您可以在其中实例化一个新帖子,验证类别参数并构建一个视图。此视图可以是新页面,也可以是弹出的模式。

    【讨论】:

    • 我不一定同意这一点。尽管这可能是一种“最佳实践”,但在某些时候您可能想要像 OP 那样做,例如通过快速回复框回复论坛帖子。视情况而定。
    • @Jake0oo0 是的,我可能应该详细说明我在这里做一个模态弹出窗口,并想知道这是否仍然是最好的方法
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-12
    • 1970-01-01
    相关资源
    最近更新 更多