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

Nic*_*nco 67 ruby-on-rails ruby-on-rails-3 strong-parameters

我正在构建一个带有Rails 4强参数的Web应用程序.

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

现在,我写了这个:

def user_params 
  params.require(:user).permit(User.fields.keys)
end
Run Code Online (Sandbox Code Playgroud)

你觉得有更好的方法吗?

Dam*_* Aw 143

你可以拨打许可证的爆炸版本.

params.require(:user).permit!
Run Code Online (Sandbox Code Playgroud)

Github上强大的Params自述文件

源代码供参考:

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
Run Code Online (Sandbox Code Playgroud)

  • 每当我看到这个页面,我都会对':all`评论感到后悔.=).`permit_all`听起来像是比爆炸更好的选择. (26认同)
  • "爆炸方法意味着将方法标记为危险" - 我认为这正是他们在这里使用爆炸方法的原因. (13认同)
  • @daemonsy:`permit(:all)`允许名为`:all`的字段.为了使这种风格像你说的那样工作,Rails必须为处理`:all`做一个特殊的案例 - 我认为这将是丑陋和令人困惑的.如果您有一个名为"全部"的列,您将成为一条小溪!我同意爆炸方法是次优选择.如果我正在设计API,我会提供`permit_all`作为更好的选择. (11认同)
  • 在旁注中,我认为如果有类似'permit:all`的东西,对我来说它似乎比一种爆炸方法更加强烈,这通常意味着接收器的改变比将方法标记为危险更频繁. (7认同)
  • @daemonsy:那是因为你对方法名称中的bang(!)含义有一个扭曲的视图.当然,对于某些方法,它意味着"改变原位"而不是制作副本.但这只是使用它的一种方式.实际的规则是:一个爆炸方法(一个以"!"结尾)是一个不以"标准"或预期方式行事的方法,所以值得特别注意或谨慎.这就是"!"的原因. (3认同)
  • @Andrew True但即便如此我认为`permit_all!`会更好看.无论如何,我很高兴这件事存在. (2认同)

vvo*_*vvo 10

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

before_action :accept_all_params

private

def accept_all_params
  params.permit!
end
Run Code Online (Sandbox Code Playgroud)

大功告成,现在您可以随心所欲地玩了!