Mar*_*ing 146 ruby ruby-on-rails
我经常发现自己在写这个:
params.delete(:controller)
params.delete(:action)
params.delete(:other_key)
redirect_to my_path(params)
Run Code Online (Sandbox Code Playgroud)
删除的痕迹感觉不对,也没有:
[:controller, :action, :other_key].each do |k|
params.delete(k)
end
Run Code Online (Sandbox Code Playgroud)
有什么更简单,更清洁的吗?
Ben*_*use 216
我猜你没有意识到Hash#,除了方法ActiveSupport添加到Hash.
它将允许您的代码简化为:
redirect_to my_path(params.except(:controller, :action, :other_key))
Run Code Online (Sandbox Code Playgroud)
此外,你不需要猴子补丁,因为Rails团队为你做了!
小智 44
使用时Hash#except处理您的问题,请注意它会引入潜在的安全问题.处理来自访问者的任何数据的一个好的经验法则是使用白名单方法.在这种情况下,Hash#slice改为使用.
params.slice!(:param_to_remove_1, :param_to_remove_2)
redirect_to my_path(params)
Run Code Online (Sandbox Code Playgroud)
Bob*_*man 24
我对您最初在问题中发布的代码感到非常满意.
[:controller, :action, :other_key].each { |k| params.delete(k) }
Run Code Online (Sandbox Code Playgroud)
Mik*_*itz 13
另一种表达dmathieu答案的方法可能是
params.delete_if { |k,v| [:controller, :action, :other_key].include? k }
Run Code Online (Sandbox Code Playgroud)
点燃猴子补丁?
class Hash
def delete_keys!(*keys)
keys.flatten.each do |k|
delete(k)
end
self
end
def delete_keys(*keys)
_dup = dup
keys.flatten.each do |k|
_dup.delete(k)
end
_dup
end
end
Run Code Online (Sandbox Code Playgroud)
从Ruby 3.0开始,Hash#except直接支持。这意味着我们不需要主动支持即可访问Hash#except.
来自文档:
\n哈希# except(*keys) \xe2\x86\x92 哈希
\n此方法返回一个新的哈希,其中包括原始哈希中除给定键之外的所有内容。
\n例子:
\nh = { a: 100, b: 200, c: 300, d: 400 }\nh.except(:a, :d) #=> {:b=>200, :c=>300}\nRun Code Online (Sandbox Code Playgroud)\n参考:
\nhttps://docs.ruby-lang.org/en/3.0.0/Hash.html#method-i- except
\n| 归档时间: |
|
| 查看次数: |
64041 次 |
| 最近记录: |