HAML 中 Javascript 中的 Ruby 方法

Posted

技术标签:

【中文标题】HAML 中 Javascript 中的 Ruby 方法【英文标题】:Ruby methods within Javascript within HAML 【发布时间】:2011-02-08 02:40:09 【问题描述】:

我有一个 jQuery 脚本,它向表单添加一个新字段,该字段包含来自数组的动态信息。问题是我不知道如何添加 array.each 来填充 javascript 中选择字段的选项,而不会破坏 HAML 缩进并导致错误。

这是我最好的尝试但不起作用:

%script(type="text/javascript")  
  $('#mylink').click(function()   
  $('#mylink').after('<select>  
  - myarray.each do |options|  
     <option value="#options.id">#options.name</option>  
  </select>);  
  );

还尝试使用 :javascript 过滤器,但没有成功。

【问题讨论】:

谢谢,看来有人帮我解决了 Markdown 缩进问题。 【参考方案1】:

通常,如果某事对 haml 来说很痛苦,则意味着您应该将棘手的部分重构为 helper 或 partial 并调用它。

// some_helper.rb
def new_snazzy_select_tag(options = [])
  select_tag 'tag_name_here', options.map  |option| [option.id, option.name] 
end

此外,您应该使用 :javascript 过滤器来呈现 javascript,因为它会为您将其放入脚本标记中并允许缩进。

最后,你可以在haml中的任何地方使用#ruby_expression,包括:javascript过滤器,当你需要将ruby表达式的结果输出到不是html元素直接内容的地方时,这非常方便。

// some_view.html.haml
:javascript
  $('#mylink').click(function()   
    $('#mylink').after("#escape_javascript new_snazzy_select_tag(myarray)");
  ;

【讨论】:

我对 Web 应用程序开发还很陌生,我从没想过使用帮助程序。我一直让我的代码非常接近 MVC,但一直想知道如何绕过我在视图中需要的循环。那应该很好用。谢谢你的回答。 助手通常位于视图和控制器之间。他们永远不应该改变任何服务器端的状态,只是为了帮助解决讨厌的视图逻辑。您的观点中的 Ruby 应该尽可能小,以便清晰和可维护。助手可以帮助解决这个问题。 TL;DR ... ?使用 #ruby_expression 感谢 Alex。 @umassthrower 不,使用辅助方法。辅助方法到目前为止是这里更重要的一点。您应该只将 simplest 方法调用放在 # 内部视图中。【参考方案2】:

试试这个,它应该可以工作(我所做的只是在第五行删除一个空格并在第六行添加结束引号):

%script(type="text/javascript")
  $('#mylink').click(function() 
  $('#mylink').after('<select>
  - @myarray.each do |options|
    <option value="#options.id">#options.name</option>
  </select>');
  );

但是,假设您使用 ruby​​ 脚本或某种框架来运行它,为什么不直接在模板之外进行呢?那可能是最合适的。在 rails/sinatra 和其他框架中,您可以使用辅助方法来执行此操作。如果您查看 haml 参考,他们实际上不鼓励使用 - 来评估 ruby​​。

【讨论】:

我在没有语法高亮的情况下从内存中输入了代码,看起来我有几个错误。我目前无法测试,但我相信这仍然会失败。我要走辅助路线,这是我以前没有想过的。谢谢。 我早些时候在一个快速的 sinatra 应用程序中测试了我在答案中的代码,它似乎工作正常(没有 haml 错误)。你确定错误不在其他地方吗?这是我得到的生成输出,带有随机选项 ID 和名称:pastie.org/920686

以上是关于HAML 中 Javascript 中的 Ruby 方法的主要内容,如果未能解决你的问题,请参考以下文章

如何在 HAML 中发表评论

在 ruby​​ 中编写条件的正确格式,然后使用 HAML 标记内的字符串插值将输出转换为字符串

Ruby HAML 与 Django?

从 ruby​​ on rails 中删除 new.haml/new.erb?

哪种 Java HTML 模板技术的工作方式最接近 Ruby (erb/haml)?

缓存的 Ruby Haml 块返回空