0

众所周知,Rails 框架建议通过所谓的 UJS 严格分离 JavaScript 和 Html,但是有时,我发现自己需要在我的视图中包含即兴的 JavaScript 片段。首先,我想知道这是否正确?还是被人嫌弃了?

我发现自己这样做的最常见情况是,例如,当我有一个像这样的条件块时:

= form_for @place do |f|
  %h5 Address:
  .input-prepend
    %span{ :class => "add-on" } 
      %i{ :class => "icon-road" }
    = f.text_field :address

  %h5 Name:
  .input-prepend
    %span{ :class => "add-on" } 
      %i{ :class => "icon-pencil" }
    = f.text_field :name

  = f.hidden_field :latitude
  = f.hidden_field :longitude

  #post-button
    %button{ :class => "btn btn-primary", :type => "submit" } Post it! 

- unless logged_in?
  :javascript
    $('#post-button > button, .input-prepend input').addClass('disabled');
    $('.input-prepend input').addClass('disabled');
    $('.input-prepend input').attr('disabled', 'disabled');
    new PopOver().setPopOver($('#post-button > button'), "You must be logged in to register your Business");

看看嵌套在除非条件中的代码,我想知道是否可以放在那里,或者我应该以某种方式从控制器生成那部分代码?(并将它(渲染)传递给视图:在这种情况下,我不知道该怎么做......)

请让我知道您的想法,我需要知道最有经验的 Rails 开发人员将如何处理这些类型的情况,因此,如果您是其中之一,我很乐意阅读您的答案。

提前致谢!

PS。哦,如果可能的话,请让我看看有关如何解决此问题的代码选项,再次感谢!

4

1 回答 1

1

UJS 无疑是目前 Rails 世界中最流行的方法,但不同的开发人员将其推向了不同的极端。我认识的一些开发人员完全回避它,因为根据他们的说法,当您仅查看 html 时,您不知道是否会通过 JS 对特定元素进行操作(我个人认为这很好,因为 HTML 只是关于结构,而不是功能)。

就您的特定问题而言,很明显,您不能简单地将 javascript 放入要与页面一起加载的常规 javascript 文件夹中,因为 javascript 不会知道您是否已登录。您可以在某处放置一个指示器DOM 表明您已登录,但对我来说这太容易被欺骗了。根据服务器上的数据决定是否运行 javascript 的一种相当安全的方法是对服务器进行 AJAX 调用,如下所示:

  1. 浏览器加载的 Javascript 对服务器进行 get AJAX 调用(使用 $.getScript() 和 jQuery)
  2. Rails 控制器中的操作使用 .js.erb 模板响应 AJAX 调用
  3. 您可以将尽可能多的服务器端逻辑放入 .js.erb 模板中(即仅在用户未登录时运行 javascript)

这样,您就可以将 javascript(功能)排除在 html(结构)之外,同时仍然能够做出服务器端决策。railscast 中有类似的场景用于动态页面缓存

例如,如果在您的 application.js 中,您有:

$.getScript('/users/show')

然后这将调用您的UsersController#show操作。然后 Rails 会寻找app/views/users/show.js.erb模板。在此文件中,您可以拥有以下内容:

<% unless logged_in? %>
  $('#post-button > button, .input-prepend input').addClass('disabled');
  $('.input-prepend input').addClass('disabled');
  $('.input-prepend input').attr('disabled', 'disabled');
  new PopOver().setPopOver($('#post-button > button'), "You must be logged in to register your Business");
<% end %>

一旦浏览器收到来自服务器的响应,javascript 就会自动运行。在这种情况下,它只会在用户未登录时运行 javascript。

于 2012-05-25T07:53:25.763 回答