Rails 4强参数:允许所有属性吗?


72

我正在使用Rails 4强大的参数构建一个Web应用程序。

构建管理员后台管理器时,我想知道允许所有模型属性的最佳方法是什么?

现在,我这样写:

def user_params 
  params.require(:user).permit(User.fields.keys)
end

您认为更好的方法吗?


为什么?我只在我信任所有用户的管理后台中执行此类操作。
Nicolas Blanco

1
仅仅因为您信任他们(并且您不应该,但是那是另一
回事

2
@sevenseacat至少他在问是否有更好的方法来做到这一点。
安德鲁·格林

1
@AndrewGrimm是的,但是他仍然希望默认情况下允许所有操作,这是不安全的事情,并且完全否定了强参数的观点。
sevenseacat

5
@Anwar“因为不必打扰我键入密钥”很可能是绕过安全措施的最糟糕的原因。
sevenseacat

Answers:


7

万一有人需要Rails 6,甚至没有模型链接到您的控制器,您可以使用:

before_action :accept_all_params

private

def accept_all_params
  params.permit!
end

完成后,现在您可以随意玩🔥了!


147

您可以致电许可的爆炸式版本。

params.require(:user).permit!

Github上的Strong Params README

供参考的源代码:

def permit!
  each_pair do |key, value|
    convert_hashes_to_parameters(key, value)
    self[key].permit! if self[key].respond_to? :permit!
  end

  @permitted = true
  self
end

7
permit :all顺便说一句,我认为如果有类似的东西,对我来说似乎比Rail的方法更像Railish,这通常意味着接收者已被更频繁地更改,而不是将方法标记为危险。
达蒙·奥

11
@daemonsy:permit(:all)允许名为的字段:all。要使这种样式像您所说的那样起作用,Rails必须为处理提供特殊情况:all-我认为这将是丑陋且令人困惑的。如果您有一个名为“ all”的专栏,那么您将会大吃一惊!我同意爆炸方法是次优的选择。permit_all如果要设计API,我将提供更好的选择。
David J.

26
每次看到此页面时,我都会为自己的:all评论感到后悔。=)。permit_all听起来比爆炸更好。
2013年

13
“爆炸方法意味着将方法标记为危险” –我想这正是他们在这里使用爆炸方法的原因。
安德鲁(Andrew)

3
@daemonsy:那是因为您对bang(!)在方法名称中的含义有误解。当然,对于某些方法,它的意思是“原地更改”而不是进行复制。但这只是使用它的一种方式。实际规则是:爆炸方法(以“!”结尾的方法)不是以“标准”或预期方式起作用的方法,因此应格外注意或谨慎。这就是“!”的原因。
Lonny Eachus 2014年

1

Skull0inc的答案有效,但您可能需要删除created_atupdated_at。强参数的目的是仅列出您要由控制器更新的属性。就像是...

def user_params
  params.require(:user).permit(User.column_names - ["created_at", "updated_at"])
end

0

这行得通吗?

def user_params 
  params.require(:user).permit(User.column_names)
end
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.