ruby 在 rails 上传递块而不是参数
ruby on rails passing block instead of argument
我有一个 rails 4 应用程序。为了识别链接,我使用了 rinku
gem。现在我正在尝试集成 best_in_place
gem 以进行内联编辑。在我的 post_comment.body
属性上,我想同时使用两者,但不知道如何让它们协同工作。
只有 rinku
的原始代码:
<%= find_links(h post_comment.body) %>
#And the corresponding method:
def find_links(text)
found_link = Rinku.auto_link(text, mode=:all, 'target="_blank"', skip_tags=nil).html_safe
end
只有 best_in_place
看起来像这样:
<%= best_in_place post_comment, :body, as: :input, url: post_post_comment_path(post_comment.post, post_comment), activator: "#activate-comment-edit-#{post_comment.id}" %>
现在我尝试组合的方式,但得到了错误的参数数量错误:
<%= find_links do %>
<%= best_in_place post_comment, :body, as: :input, url: post_post_comment_path(post_comment.post, post_comment), activator: "#activate-comment-edit-#{post_comment.id}" %>
<% end %>
我怎样才能完成这项工作?在这种情况下,ruby/rails 约定是什么?我想我应该以某种方式传递一个块,但我不知道该怎么做。
根据您要实现的目标,有多种方法可以做到这一点。这是一种方式。
def find_links(text = nil)
if block_given?
text ||= yield
end
raise ArgumentError, 'missing text' unless text
found_link = Rinku.auto_link(text, mode=:all, 'target="_blank"', skip_tags=nil).html_safe
或者,您可以让您的方法显式捕获块:
def find_links(text = nil, &block)
text ||= block.call if block
raise ArgumentError, 'missing text' unless text
found_link = Rinku.auto_link(text, mode=:all, 'target="_blank"', skip_tags=nil).html_safe
澄清一下,你真的不能"pass a block into a method"。每次使用块时,它都会被传递给方法。您的方法需要显式 yield
到块,或者需要将其捕获到 Proc
。不同之处在于 Proc
绑定了一个评估上下文。
并且要完整:您 可以 将 Proc
传递到您的方法中(就像您传递任何其他变量一样) 但像上面那样使用 yield
更为惯用
我有一个 rails 4 应用程序。为了识别链接,我使用了 rinku
gem。现在我正在尝试集成 best_in_place
gem 以进行内联编辑。在我的 post_comment.body
属性上,我想同时使用两者,但不知道如何让它们协同工作。
只有 rinku
的原始代码:
<%= find_links(h post_comment.body) %>
#And the corresponding method:
def find_links(text)
found_link = Rinku.auto_link(text, mode=:all, 'target="_blank"', skip_tags=nil).html_safe
end
只有 best_in_place
看起来像这样:
<%= best_in_place post_comment, :body, as: :input, url: post_post_comment_path(post_comment.post, post_comment), activator: "#activate-comment-edit-#{post_comment.id}" %>
现在我尝试组合的方式,但得到了错误的参数数量错误:
<%= find_links do %>
<%= best_in_place post_comment, :body, as: :input, url: post_post_comment_path(post_comment.post, post_comment), activator: "#activate-comment-edit-#{post_comment.id}" %>
<% end %>
我怎样才能完成这项工作?在这种情况下,ruby/rails 约定是什么?我想我应该以某种方式传递一个块,但我不知道该怎么做。
根据您要实现的目标,有多种方法可以做到这一点。这是一种方式。
def find_links(text = nil)
if block_given?
text ||= yield
end
raise ArgumentError, 'missing text' unless text
found_link = Rinku.auto_link(text, mode=:all, 'target="_blank"', skip_tags=nil).html_safe
或者,您可以让您的方法显式捕获块:
def find_links(text = nil, &block)
text ||= block.call if block
raise ArgumentError, 'missing text' unless text
found_link = Rinku.auto_link(text, mode=:all, 'target="_blank"', skip_tags=nil).html_safe
澄清一下,你真的不能"pass a block into a method"。每次使用块时,它都会被传递给方法。您的方法需要显式 yield
到块,或者需要将其捕获到 Proc
。不同之处在于 Proc
绑定了一个评估上下文。
并且要完整:您 可以 将 Proc
传递到您的方法中(就像您传递任何其他变量一样) 但像上面那样使用 yield
更为惯用