重构将params从视图传递到Rails 5中的控制器

时间:2017-09-09 16:33:32

标签: ruby-on-rails

因此下面的代码正常工作,它将“体验”参数传递给我的控制器。我的问题围绕着找到更好的方法来传递option1,option2等的参数......当它们存在时。我有很多范围,我过滤数据的范围越多,filtered_jobs_path就越长。我是相对较新的rails所以也许这是唯一的方法,但似乎应该有一种方法列出所有其他过滤器选项(option1,option2等...),然后调用它视图所以每个link_to都不是一英里长,这可能吗?

<div class="well">
  <%= link_to "0-2 years", filtered_jobs_path(experience: '0-2 years', option1: params[:option1], option2: params[:option2]) %><br />
  <%= link_to "2-5 years", filtered_jobs_path(experience: '2-5 years', option1: params[:option1], option2: params[:option2]) %><br />
  <%= link_to "5-10 years", filtered_jobs_path(experience: '5-10 years', option1: params[:option1], option2: params[:option2]) %><br />
  <%= link_to "10+ years", filtered_jobs_path(experience: '10+ years', option1: params[:option1], option2: params[:option2]) %>        
</div>

2 个答案:

答案 0 :(得分:0)

这是你在找什么?

# some_helper.rb
def filtered_jobs_link(text)
  link_to text, filtered_jobs_path(experience: text, option1: params[:option1], option2: params[:option2])
end


#some_view.html.erb
<div class="well">
  <%= filtered_jobs_link "0-2 years" %><br />
  <%= filtered_jobs_link "2-5 years" %><br />
  <%= filtered_jobs_link "5-10 years" %><br />
  <%= filtered_jobs_link "10+ years" %>        
</div>

答案 1 :(得分:0)

创建帮助器:

module JobsHelper
  def filtered_jobs_link(text, **opts)
    opts.reverse_merge!(params.slice(:option1, :option2))
    link_to text, filtered_jobs_path(opts)
  end
end

然后遍历选项:

<ul>
  <% ["0-2 years", "2-5 years", "5-10 years", "10+ years"].each do |o|%>
    <li><%= filtered_jobs_link(o, experience: o) %></li>
  <% end %>
</ul>

如果您真的必须使用该特定标记:

module JobsHelper
  def filtered_jobs_link(text, **opts)
    opts.reverse_merge!(params.slice(:option1, :option2))
    link_to text, filtered_jobs_path(opts)
  end

  def filtered_jobs_by_experience(*options)
    options.map { |o| filtered_jobs_link(o, experience: o) }.join('</ br>')
  end
end
<div class="well">
  <%= filtered_jobs_by_experience("0-2 years", "2-5 years", "5-10 years", "10+ years") %>
</div>