【问题标题】:Ruby methods within Javascript within HAMLHAML 中 Javascript 中的 Ruby 方法
【发布时间】: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 缩进问题。

标签: javascript jquery ruby haml


【解决方案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
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-17
  • 2017-04-24
  • 1970-01-01
  • 2012-06-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多