【问题标题】:How much code in a rails view is ok?Rails 视图中有多少代码合适?
【发布时间】:2010-10-19 13:15:51
【问题描述】:

我知道最好将代码保留在表示层之外。但是,我想知道有多少被认为是“可接受的”。例如,我用这行代码填充了一个 html 选择框。

CodesecureProject.find(:all,:order => 'name').collect {|project| [project.name, project.id] }

现在我在表单中嵌入了这行代码。我想知道社区是否认为这是否是太多代码,它应该首先存储在控制器上的实例变量中,然后存储在表单中使用的变量中。

【问题讨论】:

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


    【解决方案1】:

    我不会说我永远不会这样做(我会撒谎),但给出的代码示例会让我感到紧张。我想我更倾向于将数据从我的控制器传递到选择框。如果我注意到我不止一次地做某事,辅助方法是另一种选择。我更有可能在控制器中看到重复而不是在不同的视图中看到。

    如果我在多个视图中使用相同的 HTML 组件,那么我可能会发现自己正在使用部分内容或将整个内容包装在自定义帮助器中:project_select() 或类似的东西。

    我在 MVC 领域工作得越多,我就越发现自己在视图中避免代码。我有一种感觉,如果我达到零代码状态,就会达到某种禅宗掌握,尽管除了哲学术语之外的任何东西的价值都值得商榷。

    【讨论】:

      【解决方案2】:

      我在站点模型中使用以下静态方法来实现类似的功能:

      class Site
        def self.select_options
          Site.find(:all, :order => 'UPPER(name)').collect {|s| [s.name, s.id]}
        end
      def
      

      然后在我的域视图中调用:

      <%= f.select :site_id, Site.select_options %>
      

      这非常适合这些情况。

      在您的情况下,您可以尝试:

      class CodesecureProject
        def self.select_options
          CodesecureProject.find(:all, :order => 'name').collect {|p| [p.name, p.id]}
        end
      end
      

      然后通过视图调用它:

      <%= f.select :codesecure_project_id, CodesecureProject.select_options %>
      

      【讨论】:

      • 如果你有一个不变的列表,比如州或国家,你甚至可以做一个类常量,然后每个 Rails 实例只加载一次。
      【解决方案3】:

      我的项目中有很多相同的代码,只是我尽量不做任何发现。在你的情况下,我会创建一个命名范围

      named_scope :order, lambda { |order| {:order => order}}
      

      并制作代码:

      CodesecureProject.order(:name).collect {|project| [project.name, project.id] }
      

      干净一点。

      如果您有很多需要名称和 id 的选择框(有时我确实会这样做),您也可以尝试制作一个除 ModelName 之外并返回您需要的数组的帮助器。

      def magic_for_select(model)
        model.all.collect{|instance| [instance.name, instance.id]}
      end
      

      【讨论】:

      • 调用你的作用域“ordered_by”实际上会让这段代码读起来很自然!
      【解决方案4】:

      我会比 Maran 走得更远一些。通常我会这样做:

      • 在模型中创建一个 named_scope 来执行查找。
      • 从控制器调用 named_scope 并将结果存储在实例变量中。
      • 仅将实例变量放在视图中。

      如果绝对必要,我只会使用助手。稍后回顾您的代码时,如果您看到控制器设置视图所需的数据,而不是视图调用帮助程序(另一个要查看的文件),则更容易理解事物。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-23
        • 2011-05-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-26
        • 1970-01-01
        相关资源
        最近更新 更多