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

时间:2016-11-18 17:45:28

标签: ruby-on-rails angularjs ruby haml

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

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

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

2 个答案:

答案 0 :(得分:1)

免责声明:我对Angular不好(甚至没有触及版本2)。以下内容不是最佳做法或其他任何内容。

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

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

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

然后你可以通过角度

中的$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 }}

答案 1 :(得分:0)

我建议您使用角度常量而不是窗口,然后您可以将其用作服务

    // 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/
    )