我经常写下如下代码:
params.delete(:controller)
params.delete(:action)
params.delete(:other_key)
redirect_to my_path(params)
删除的轨迹感觉不对,这样做也不对:
[:controller, :action, :other_key].each do |k|
params.delete(k)
end
有没有更简单、更干净的方法?
我经常写下如下代码:
params.delete(:controller)
params.delete(:action)
params.delete(:other_key)
redirect_to my_path(params)
删除的轨迹感觉不对,这样做也不对:
[:controller, :action, :other_key].each do |k|
params.delete(k)
end
有没有更简单、更干净的方法?
redirect_to my_path(params.except(:controller, :action, :other_key))
此外,您无需进行猴子补丁,因为Rails团队已经为您完成了!
except
没有起作用。但是 except!
却可以。Rails 3.0 - TripUser.attributes.except("id", "created_at", "updated_at")
。无法使用符号作为键。 - house9attributes
方法返回一个带有String
键的Hash
。因此,您必须在.except()
中使用字符串键名。但是,我使用Hash.symbolize_keys
来解决这个问题,例如@user.attributes.symbolize_keys.except(:password, :notes)
--使用symbolize_keys
使其按预期工作。 - FireDragon虽然使用Hash#except
可以解决您的问题,但请注意它会引入潜在的安全问题。处理来自访问者的任何数据的一个好的经验法则是使用白名单方法。在这种情况下,应该使用Hash#slice
。
params.slice!(:param_to_keep_1, :param_to_keep_2)
redirect_to my_path(params)
{:b=>2, :c=>3}:Hash
- Khurram Raza我完全满意你在问题中最初发布的代码。
[:controller, :action, :other_key].each { |k| params.delete(k) }
Hash
,这是最好的答案 :+1: - Dan Bradbury重新表述dmathieu的答案的另一种方式可能是
params.delete_if { |k,v| [:controller, :action, :other_key].include? k }
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
delete(k)
而不是 delete(key)
。 - Vincentdelete_keys
实现应该简单地是 dup.delete_keys!(*keys)
。 - PhrogzHash#except
,这意味着我们不需要使用 activesupport 来访问Hash#except
。h = { a: 100, b: 200, c: 300, d: 400 }
h.except(:a, :d) #=> {:b=>200, :c=>300}
Reference:
https://docs.ruby-lang.org/en/3.0.0/Hash.html#method-i-except
我不知道你认为你提出的解决方案有什么问题。我猜想你想在Hash上添加一个delete_all
方法或者类似的东西?如果是这样,tadman的答案提供了解决方案。但是,坦率地说,对于一次性的操作,我认为你的解决方案非常容易理解。如果你经常使用它,你可能需要将其封装在一个帮助方法中。
Hash#except!
,但最好使用Hash#except
(不要搞乱params
!)。一般来说,除非绝对必要,否则不要直接修改任何对象,因为副作用可能会导致意外的结果。 - tokland