2010-09-01 4 views
3

Я только что обновил до Rails3, Ruby 1.9.2 и новейший камень HAML. Этот код используется для работы:Блок HAML возвращает `0` на выходе?


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

Теперь allowed? дает 0.

Это работает, если я:


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

Что это дает?

+0

что это разрешено? делать или возвращаться? – corroded

+0

разрешено? является помощником для драгоценного камня, который я написал, RESTful_ACL. Он выводит URL, на который вы ссылаетесь, и отображает его на основе разрешений на уровне модели. Он просто дает ссылку или вообще ничего. RESTful_ACL получает «0», поэтому он определенно находится на уровне HAML/Ruby. –

+0

У меня такая же проблема. Когда я передаю блок (только строку) с помощью 'do' для моего вспомогательного метода, тогда' yield' дает мне '1' (Fixnum) вместо строки, а строка выводится отдельно перед вспомогательным методом. Однако он отлично работает с блоком, переданным с помощью '{}'. – Andrei

ответ

0

Почему вы эхом отдаете результат этого в первую очередь? Вы должны делать:

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

В общем, вы никогда не хотите использовать выходной оператор (=) с блоком. Материал, выводимый в блоках, не возвращается в блок; он напрямую связан с буфером. Использование такого блока, вероятно, приведет к ошибкам с отсутствием порядка содержимого.

+1

Я делаю это так, как правило, но Rails 3 жалуется на ошибку с отсрочкой ... –

0

Это мне потребовалось некоторое время, чтобы найти, но это то, как вы это делаете:

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

Проблема заключается в том, что Haml выводит все на свой собственный специальный буфер перед отправкой его на стойку или где угодно. Поэтому вы должны позволить хамлю сначала вызвать блок и закрепить его.

1

Чистейший способом сделать это понятие доходности, чтобы все, что содержание вы хотели бы быть соответствующим образом является:

= 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) 
+0

определенно используйте 'capture_haml' ... Келли, вы помогли мне решить эту проблему: http: //ruby-on-rails-eq8.blogspot .co.uk/2014/10/yielding-haml-block-will-return-0-zero.html спасибо – equivalent8