Rails:两个实例变量或只是一个,并在视图中创建另一个变量

时间:2012-01-16 21:52:12

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

我怀疑Rails中的礼貌,我相信MVC一般。我有一个控制器,它从给定特定条件的模型中检索一些对象。我需要视图中的那些对象,我还需要一个具有这些对象属性的特定数据结构。那个数据结构是这样的:

[[object1.attr1, object1.attr2],[object2.attr2,object2.attr2],...]

我的问题是:

我应该在控制器中创建两个实例变量:一个是从模型中检索到的所有对象,另一个是从这些对象的属性创建的数据结构,或者我应该只创建一个包含所有对象的实例变量在视图中创建该数据结构?

2 个答案:

答案 0 :(得分:2)

这取决于你,但你不应该在视图中创建数据结构。

要么在控制器功能中执行,要么在模型中与模型紧密耦合。从有限的描述来看,它听起来像属于模型,但很难说。

答案 1 :(得分:1)

您可以将一些代码移出视图:

  1. 查看助手
  2. 控制器
  3. 模型
  4. Rails Helper (选项1)似乎更适合您的情况。例如,如果您需要填充select标记,则使用返回options_for_select(...your complex structure formatted)的方法的帮助程序将是正确的选择。

    您可以这样使用options_for_select(来自rails guides

    <%= options_for_select([[object1.attr1, object1.attr2],[object2.attr2,object2.attr2],...], 2) %>将成为:

    <option value="object1-attr2-value">object1-attr1-value</option>
    <option value="object2-attr2-value" selected="selected">object2.attr1-value</option>
    ...
    

    您可以在 ApplicationHelper (如果需要在应用程序范围内)或在特定于模型的帮助程序中添加该方法:

    # app/helpers/...the helper you choose
    def options_for_your_complex_select(default_state)
      options_for_select( [[object1.attr1, object1.attr2],[object2.attr2,object2.attr2],...],
                      default_state )
    end
    

    并以这种方式在您的视图中使用此帮助程序(请选择比我更好的方法名称:)):<%= select_tag :state, options_for_your_complex_select(params[:default_state]) %>

    这将有助于您使代码更易于管理,并使您的视图更具可读性。 Rails best practices website对此有更多了解。在ViewHelperModelController中了解移动代码的方式。

    如果你必须处理很多属性,@ryanb的这个screencast about the draper gem解释了如何简化你的观点。