如何在 javascript 文件夹中的 haml 文件中定义 ruby 代码

How to define ruby code inside a haml file present in javascript folder

对于我的项目,我使用 Ruby on RailsAngular,并且 /project_name/app/assets/javascript 文件夹中有一个 haml 文件。我想从 haml 文件中调用 ruby class,但不幸的是我无法做到这一点。

 .small-12.columns
    .booking-time
      %span.bold
        - if ABC::D.data(:hide_hours_field)  #ruby code 
          {{ item | timeformat }}
        - else
          {{ item | differentTimeFormat }}

每当我启动服务器时,它都显示无法访问 ruby class。我可以轻松访问其他 haml 文件中的 ruby class,但不能访问 javascript 文件夹中的文件。有人能帮我一下吗?

免责声明:我不擅长 Angular(甚至没有接触版本 2)。以下内容不是最佳实践或任何东西。

因此,您需要使用 ruby 方面的一些知识来配置您的 angular 视图。您不能有条件地渲染它,也不能从 angular 控制器调用 ruby(很明显)。我建议通过 window 对象走私数据。

在您的应用程序的适当视图中,放置此 JS 代码段。

<script type='text/javascript'>
    window.jsEnv = {
      hide_hours_field: <%= ABC::D.data[:hide_hours_field] %> 
    }
</script>

然后您可以通过 angular

中的 $window 对象引用它

控制器

function MyController($window) {
  this.hideHours = function() {
    return !!$window.jsEnv.hide_hours_field;
  }
}

MyController.$inject = ['$window'];

angular.module('myApp').controller('MyController', MyController);

查看

.small-12.columns(ng-controller='MyController as vm')
  .booking-time
    %span.bold(ng-if='vm.hideHours()')
      {{ item | timeformat }}
    %span.bold(ng-unless='vm.hideHours()')
      {{ item | differentTimeFormat }}

我建议你使用 angular 常量而不是 window 然后你可以将它用作 service:

    // index.html
    <script type="text/javascript">
      angular.module('myApp').constant('CURRENT_USER', #{current_user.to_json})
    </script>

    // controller
    function ApiConsoleController($scope, CURRENT_USER) {
      console.debug(CURRENT_USER)
    }

另外,你可以尝试使用angular-rails-templates

    // application.rb
    config.angular_templates.ignore_prefix = %w(
      angular/components/
      angular/shared/
      angular/directives/
      angular/validators/
    )