2016-03-20 9 views
-1

私はレール4アプリを持っています。リンクを認識するために、私はrinku gemを使用しています。今私はインライン編集のためにbest_in_place gemを統合しようとしています。私のpost_comment.body属性では、一度に両方を使いたいのですが、一緒に働かせる方法を理解できません。引数の代わりにブロックを渡すルビーon

<%= 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}" %> 

今の方法:

のみ rinku

オリジナルコード

<%= 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 %> 

どうすればこの作品を作成できますか?このような場合のルビー/レールの規則は何ですか?私は何とかブロックに通るべきだと思いますが、どうやってそれをするのか分かりません。

+0

さて、上記のようなyieldを使用する方が慣用であります何かを 'find_links'に渡して、それは議論を期待しています、それは意味がありますね。 'find_links'が' best_in_place'の出力を期待している場合、なぜその呼び出しの結果を 'find_links'に渡しませんか? –

+0

デイブ、コードでそれを表示できますか?私は、コード全体を引数に渡すことは奇妙に見えるでしょう。 –

+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 

明確にするために、あなたは本当に「メソッドにブロックを渡す」ことができません。ブロックを使用するたびに、メソッドに渡されます。あなたのメソッドはブロックに明示的にyieldを必要とするか、それをキャプチャしてProcにする必要があります。違いは、Procに評価コンテキストがバインドされている点です。

かつ完全にするために:あなたはがあなたの方法にProc(ちょうどあなたでしょう、他の変数と同様に)渡すことができますが、あなたがいない場合、

+0

ジョシュ、詳細な答えをありがとう!なぜあなたはarg nil( 'text = nil')を設定しますか?私は '(h message.body)'だけを渡す他のモデルに対してもこのメソッドを使いたいと思っています。だから私は属性を渡すか、このベストをプレースコードに渡すとうまくいくはずです。 –

+0

ここで 'text = nil'とは、' text'に 'nil'のデフォルト値を与えることです(オプションです)。このメソッドには2つのエントリポイントがあります( 'text'を渡すか、ブロックを評価する)。 'text'をオプションにしなかった場合は、そのユースケースのブロックと一緒に渡す必要があります –

関連する問題