ruby on rails传递块而不是参数

时间:2016-03-20 14:25:45

标签: ruby-on-rails ruby best-in-place

我有一个rails 4 app。用于识别我使用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}" %>

现在我尝试组合的方式,但错误的args错误数量:

<%= 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约定是什么?我想我应该以某种方式传递一个块,但我不知道该怎么做。

1 个答案:

答案 0 :(得分:2)

根据您尝试实现的目标,有多种方法可以实现此目的。这是一种方式。

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

为了澄清,你无法将一个块传递给一个方法&#34;。每次使用块时,它都会传递给方法。您的方法需要明确yield到块,或者需要将其捕获到Proc。区别在于Proc具有绑定到它的评估上下文。

并且要完整: 可以 Proc传递给您的方法(就像您使用任何其他变量一样)但是使用它更加惯用yield如上所述