Rails关于控制器/视图特定javascript的最佳实践

Rails关于控制器/视图特定javascript的最佳实践,javascript,ruby-on-rails,asset-pipeline,Javascript,Ruby On Rails,Asset Pipeline,有了Rails3+和资产管道,我的理解是,如果您指定,assets/javascripts下的所有javascript文件都会自动包含并编译成一个js文件 require_tree . 在application.js中 处理特定于控制器/视图的javascript的最佳实践是什么?例如,假设我有一个控制器/视图“Houses”,我想使用jquery表单验证插件验证Houses表单,为此,我在Houses.js文件中放置了以下代码 $(document).ready(function(){

有了Rails3+和资产管道,我的理解是,如果您指定,assets/javascripts下的所有javascript文件都会自动包含并编译成一个js文件

require_tree . 
在application.js中

处理特定于控制器/视图的javascript的最佳实践是什么?例如,假设我有一个控制器/视图“Houses”,我想使用jquery表单验证插件验证Houses表单,为此,我在Houses.js文件中放置了以下代码

$(document).ready(function(){
  $("#new_house_form").validate();
});
这很好,但问题是当我访问另一个页面(比如/owner)时,它试图验证houses表单,我在javascript控制台中收到一条错误消息。当然,我可以检查表单是否存在于当前页面上,然后才调用验证器,但这对我来说似乎有点不干净,尤其是如果我在.ready中有很多特定于控制器的代码

我的解决方案是在application.js中创建一个文件夹assets/javascripts/global

 require_tree ./global //instead of require_tree .
并移动其中除houses.js之外的所有其他js文件。然后,每当用户访问/houses/new或/houses/edit时,我都手动包含houses.js


这种做法可以接受吗?如果不是,那么处理这些情况的最佳实践是什么?

通常我只是让所有的js加载,并在调用任何方法之前检查元素是否存在

$(document).ready(function(){
  if($("#new_house_form").length > 0){
    $("#new_house_form").validate();
  }
});

这里有一个很好的解决方案:问题在于,如果javascript中有大量特定于控制器/视图的代码(不仅仅是表单),那么您就需要进行大量此类错误检查。在这里和那里进行奇怪的验证是可以的,但是随着javascript的增长,它会变得非常难看。我希望有一种比手动错误检查或我在问题中描述的方法更干净的方法来处理这个问题。是的,使用这种方法,你的javascript中会有很多错误检查。这是一个快速解决你的问题。如果你想要一个更干净的解决方案,请查看@agmin在其评论上发布的链接。看起来是个不错的解决方案。