将 Rails 参数哈希传递给命名路由的更有效方法
Posted
技术标签:
【中文标题】将 Rails 参数哈希传递给命名路由的更有效方法【英文标题】:More-efficient way to pass the Rails params hash to named route 【发布时间】:2011-06-01 09:19:39 【问题描述】:我需要一种更有效的方法将参数哈希传递给命名路由,包括添加/删除/修改键/值对的能力。
添加一个键(:company 符号),同时保留 params 哈希的其余部分(手动指定每个符号/值):
# adds the company filter
link_to_unless params[:company]==company, company, jobs_path(:company=>company, :posted=>params[:posted],:sort=>params[:sort],:dir=>params[:dir])
删除一个键(消除 :company 符号),同时保留 params 哈希的其余部分(手动指定每个符号/值):
# create a link that removes the company filter
link_to_unless_current 'x', jobs_path(:posted=>params[:posted],:sort=>params[:sort],:dir=>params[:dir])
我想直接传递 params 哈希,但这会引发异常:
link_to_unless params[:company]==company, company, jobs_path( params )
我希望有一些 DRYer 替代品。
【问题讨论】:
没有路由匹配 :dir=>'ASC',... 【参考方案1】:重构了辅助函数:
def options(hash)
o=:employer=>params[:employer],:location=>params[:location],:posted=>params[:posted],:starting=>params[:starting],:sort=>params[:sort],:dir=>params[:dir],:fav=>params[:fav]
# add the contents of hash, overwriting entries with duplicate keys
o.merge!(hash)
end
重构视图代码以传递哈希而不是键/值对;更大的灵活性:
<%= link_to_unless params[:employer]==employer, employer, jobs_path( options(:employer=>employer) ) %>
和
<%= link_to_unless_current '✗', jobs_path( options(:employer=>nil) ) %>
【讨论】:
【参考方案2】:这种方法有效,但似乎不是最优的:
帮手:
def options(key, value)
# create a hash of all params
o=:employer=>params[:employer],:posted=>params[:posted],:starting=>params[:starting],:sort=>params[:sort],:dir=>params[:dir]
# set value
o[key]=value
# return hash
o
end
查看:
# change symbol's value
<%= link_to_unless params[:employer]==employer, employer, jobs_path( options(:employer, employer) ) %>
# remove symbol
<%= link_to_unless_current '✗', jobs_path( options(:employer, nil) ) %>
看来我应该可以直接使用 params 哈希,但这暂时可以使用。
【讨论】:
【参考方案3】:重构版本。把它放在目标控制器中,这样它就不会是全局的:
# new_params: new parameters you wish to pass on
# white_list: array of symbols, representing additional keys from existing params which you wish to pass on
def options(new_params, white_list = [])
white_list += [ :employer,:location,:posted,:starting,:sort,:dir,:fav ]
white_list.uniq!
new_params.reverse_merge( params.slice(white_list) )
end
helper_method :options
【讨论】:
以上是关于将 Rails 参数哈希传递给命名路由的更有效方法的主要内容,如果未能解决你的问题,请参考以下文章
ReactJS:从 rails 传递参数以将路由器反应到组件
Java:将命名和未命名参数的组合传递给可执行的 jar/main 方法
在 URL Rails Routes 中添加 Hash 参数
从数组或对象(而不是哈希)生成路由时,如何将“only_path:true”和“anchor:”等选项传递给“url_for”