Refactor Rails 3个视图 - 将逻辑移动到<model> _helper </model>

时间:2010-12-13 15:13:29

标签: views helpers ruby-on-rails-3

我想将以下内容从我的View中移到模型的关联助手中:

<%= link_to_unless params[:aged]=='0', "0", jobs_path(:aged => '0', :sort=>params[:sort],:dir=>params[:dir],:fav=>params[:fav]) %> |
<%= link_to_unless params[:aged]=='30', "30", jobs_path(:aged => '30', :sort=>params[:sort],:dir=>params[:dir],:fav=>params[:fav]) %> |
<%= link_to_unless params[:aged]=='60', "60", jobs_path(:aged => '60', :sort=>params[:sort],:dir=>params[:dir],:fav=>params[:fav]) %> |
<%= link_to_unless params[:aged]=='90', "90", jobs_path(:aged => '90', :sort=>params[:sort],:dir=>params[:dir],:fav=>params[:fav]) %>

我试过这个,但是它会导致一个UNEXPECTED IDENTIFIER错误(显然我需要将link_to_unless的结果连接到'|'):

link_to_unless params[:aged]=='0', "0", users_path(:aged=>'0',:sort=>params[:sort],:dir=>params[:dir],:fav=>params[:fav]) |
link_to_unless params[:aged]=='30', "30", users_path(:aged=>'30',:sort=>params[:sort],:dir=>params[:dir],:fav=>params[:fav]) |
link_to_unless params[:aged]=='60', "60", users_path(:aged=>'60',:sort=>params[:sort],:dir=>params[:dir],:fav=>params[:fav]) |
link_to_unless params[:aged]=='90', "90", users_path(:aged=>'90',:sort=>params[:sort],:dir=>params[:dir],:fav=>params[:fav])

似乎我需要将这些帮助方法的结果插入到HTML流中,但我不确定最佳方法。

现在Rails 3始终包含所有帮助程序(helper:all)有没有办法指示模型的视图只使用与模型关联的帮助程序?此时,我将模型的名称添加到函数的名称中 - 例如,'jobs_sorted_column'。

**编辑**

重构

jobs_helper:

  def posted_filter(bucket)

    link_to_unless params[:posted]==bucket, bucket, jobs_path(:posted =>bucket, :starting=>params[:starting],:sort=>params[:sort],:dir=>params[:dir])

  end

视图:

[ <% ['0','30','60','90'].each do |bucket| %>
    <%= posted_filter(bucket) %> |
<% end %> ]

的问题:

  • 结果输出看起来像[0 | 30 | 60 | 90 | ]。是否有一个简单的解决方法来删除第4个'|'?
  • 似乎会有一种更优雅的方式将参数传递给路线,包括一个“过度”的值(在我的例子中,发布了=&gt;桶)。

2 个答案:

答案 0 :(得分:3)

尝试使用collectjoin,例如:

<%= ['0','30','60','90'].collect{ |x| "#{posted_filter(x)}" }.join(' | ') %>

请参阅:Array #collect

答案 1 :(得分:1)

你可以做得更好:

def posted_filters(*args)
  args.collect { |bucket|
    link_to_unless(params[:posted]==bucket, bucket, jobs_path(:posted =>bucket, :starting=>params[:starting],:sort=>params[:sort],:dir=>params[:dir]))
  }.join(' | ').html_safe
end

在您的观看代码中:

[ <%= posted_filters(0, 30, 60, 90) %> ]