【问题标题】:HAML block returning `0` on yield?HAML块在产量上返回“0”?
【发布时间】:2011-04-06 21:21:13
【问题描述】:

我刚刚升级到 Rails3、Ruby 1.9.2 和最新的 HAML gem。 此代码曾经有效:


  = allowed? do
    = link_to('New', new_video_path)

现在allowed? 产生0

如果我这样做,它会起作用:


  = allowed?{ link_to('New', new_video_path) }

什么给了?

【问题讨论】:

  • 什么是允许的?做还是回来?
  • 是否允许?是我写的一个 gem 的助手,RESTful_ACL。它推断您链接到的 URL 并根据模型级权限显示它。它只是产生链接,或者根本没有。 RESTful_ACL 接收到“0”,所以它肯定在 HAML/Ruby 级别。
  • 我也有同样的问题。当我使用do 将一个块(只是一个字符串)传递给我的辅助方法时,yield 给了我1(Fixnum)而不是字符串,并且字符串在辅助方法之前单独呈现。但是,它适用于使用 {} 传递的块。

标签: ruby ruby-on-rails-3 haml block yield


【解决方案1】:

为什么你首先要回显它的输出?你应该这样做:

- allowed? do
  = link_to('New', new_video_path)

一般来说,您永远不想将输出运算符 (=) 与块一起使用。块中输出的东西不会返回到块中;它直接连接到缓冲区中。使用这样的块可能会产生内容乱序的错误。

【讨论】:

    【解决方案2】:

    这花了我一段时间才找到,但你是这样做的:

    def wrap_in_div(&block)
      "<div>#{capture_haml(&block)}</div>"
    end
    

    问题在于,haml 在将所有内容发送到机架或任何地方之前,会将所有内容输出到自己的特殊缓冲区。所以你得让haml先调用block,然后缓冲一下。

    【讨论】:

      【解决方案3】:

      实现此收益概念以允许正确捕获您想要的任何内容的最简洁方法是:

      = allowed? do
        - capture_haml do
          = link_to('New', new_video_path)
      

      不过,在你的情况下,为什么不写另一个辅助方法呢?

      def allowed_link_to(*args, &block)
        opts = args.extract_options!
        if allowed? args.last
          link_to args.push(opts), &block
        else
          ''
        end
      end
      

      并像这样使用它:

      = allowed_link_to('New', new_video_path)
      

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-12
      • 2020-12-16
      • 1970-01-01
      • 2018-03-29
      相关资源
      最近更新 更多