rails视图中有多少代码可以吗?

时间:2009-04-15 09:32:04

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

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

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

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

4 个答案:

答案 0 :(得分:5)

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

如果我在多个视图中使用相同的HTML组件,那么我可能会发现自己会触及部分或将整个事物包装在自定义帮助器中:project_select()或其他一些。

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

答案 1 :(得分:4)

我在Site模型中使用以下静态方法来实现类似的东西:

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 %>

答案 2 :(得分:1)

我的项目中有很多相同的代码,除了我尝试不做任何查找。在你的情况下,我会建立一个命名范围

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

答案 3 :(得分:1)

我会比Maran更进一步。一般来说,我会做以下事情:

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

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