在Rails中将数据从控制器传递到视图的推荐方法是什么?

时间:2016-02-29 23:35:47

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

据我所知,有两种方法可以做到这一点:

  • 设置实例变量
  • 声明帮助方法

我想知道在视图和控制器之间共享数据的推荐/最佳方式是什么以及为什么。

另外,为什么传递多个变量被认为是一种不好的做法。

我想尽可能地将视图与控制器分离。

1 个答案:

答案 0 :(得分:0)

我知道这是一个过于宽泛的问题。而且,受到很多意见(这不是很好)。然而,从设计的角度来看,它并不是一个完全无趣的问题。

所以,最近在我的项目中,几乎所有的控制器都开始看起来像这样:

  # app/controllers/foo_controller.rb
  class FooController < ApplicationController

    ...

    def create
      @result = FooManager.create(params)
      if @result[:success]
        redirect_to successful_create_path
      else
        redirect_to unsuccessful_create_path
      end
    end

    ...

  end

而且,我有经理和#39; (很多人称他们为服务对象&#39;或服务对象&#39;),如下所示:

  # app/managers/foo_manager.rb
  class FooManager

    ...

    class << self

      def create(params)
        # do stuff 
        # always return a hash which optionally includes :success 
        # depending on whether create was successful or not
      end

    end
  end

现在,我确保@result包含视图需要正确呈现的所有内容。

为什么这么大惊小怪?当我这样做时:

  1. 我的观点对我的模型一无所知,所以我可以安全地对我的模型进行更改,而不必担心我的哪些观点会被破坏(只要我的@result散列是良好的形成) - 所以,这里很好的脱钩;

  2. 我的控制器没有(或很少)关于我的模型,所以我可以安全地进行更改而不会扰乱我的控制器 - 所以,这里很好的解耦;

  3. 经常,我的模特彼此之间知之甚少,我的经理处理多模型交易,这让我的模特变得不那么胖和上帝 - 所以,这里很好的脱钩;

  4. 服务对象(普通的旧Ruby对象或&#39; PORO&#39;)非常容易测试。