2011-01-04 8 views
0

次のビューコードは(予想通り)の合計との一連のリンクを生成します。私は、ビューのコードをリファクタリングし、ヘルパーにロジックを移動するとRailsの3リファクタリング問題

<% @jobs.group_by(&:employer_name).sort.each do |employer, jobs| %> 
    <%= link_to employer, jobs_path() %> <%= "(#{jobs.length})" %> 
<% end %> 

はしかし、コードは」doesnの期待通りの仕事。

ビュー:

<%= employer_filter(@jobs_clone) %> 

ヘルパー:

def employer_filter(jobs) 
    jobs.group_by(&:employer_name).sort.each do |employer,jobs| 
     link_to employer, jobs_path() 
    end 
end 

次の出力が生成されます。

<Job:0x10342e628>#<Job:0x10342e588>#<Job:0x10342e2e0>Employer A#<Job:0x10342e1c8>Employer B#<Job:0x10342e0d8>Employer C#<Job:0x10342ded0>Employer D# 

は、私が何を理解していないのですか?最初の紅潮では、コードは同等のようです。

答えて

0

私はそれを望んだとしてこの構文は働いた:

def employer_filter(jobs_clone) 
    jobs_clone.group_by(&:employer_name).sort.collect { |group,items| 
     link_to(group, jobs_path()) + " (#{items.length})" 
    }.join(' | ').html_safe 
end 
1

最初の例では、erbに直接出力しています.2番目の例では、そのメソッドの結果を返しています。

これを試してみてください:

def employer_filter(jobs) 
    employer_filter = "" 
    jobs.group_by(&:employer_name).sort.each do |employer,jobs| 
     employer_filter += link_to(employer, jobs_path()) 
    end 
    employer_filter 
end 

次にビューでこのようにそれを呼び出す:

raw(employer_filter(jobs)) 

はまた、 "生" の使用を注意してください。テンプレートから文字列を生成したら、htmlをエスケープしたくないということをレールに伝える必要があります。

明示的に文字列を作成する代わりに、 "inject"コマンドを使用することもできますが、私は怠惰で、テストなしで動作することを知っています。

+0

閉じます。実際のリンクの代わりにEmployer Aのような値を返します。私は.injectの構文を見るのが好きです。 OrderedHash(これは1つ)が.collectメソッドをサポートしていますか? – craig

+0

「実際のリンク」はどういう意味ですか? –

+0

リンクの代わりに、アンカータグが上記のようにテキストとして表示されます。私はこれが「エスケープ」と呼ばれると思います。 – craig