强参数需要多个

Rob*_*Rob 29 ruby ruby-on-rails ruby-on-rails-4

我收到的JSON包如下:

{
  "point_code" : { "guid" : "f6a0805a-3404-403c-8af3-bfddf9d334f2" }
}
Run Code Online (Sandbox Code Playgroud)

我想告诉大家,两个轨point_codeguid需要,而不仅仅是不允许的.

这段代码似乎有效,但我不认为这是好习惯,因为它返回一个字符串,而不是完整的对象:

params.require(:point_code).require(:guid)
Run Code Online (Sandbox Code Playgroud)

我有什么想法可以做到这一点?

sar*_*unw 24

我有类似的需求,我做的是

def point_code_params
  params.require(:point_code).require(:guid) # for check require params
  params.require(:point_code).permit(:guid) # for using where hash needed
end
Run Code Online (Sandbox Code Playgroud)

例:

def create
  @point_code = PointCode.new(point_code_params)
end
Run Code Online (Sandbox Code Playgroud)

  • 你的方法的第一行没有做任何事情.它不会改变状态或任何东西,返回值是重要的,它只是消失,因为你没有将它分配给任何东西.你应该只需要第二行`params.require(:point_code).permit(:guid)` (10认同)
  • 不起作用,因为它导致错误:私有方法`require'调用"xxxxxxxx":字符串 (7认同)
  • 强参数的 api 很棒 (5认同)
  • @FloatingRock:在我的情况下,请求正文就像 { "id": 123, "name": "foo", "bar": "foobar" } 如何要求所有参数? (2认同)

rav*_*ren 9

截至2015年(RoR 5.0+),您可以将一组键传递给requirerails中的方法:

params.require([:point_code, :guid])

http://api.rubyonrails.org/classes/ActionController/Parameters.html#method-i-require

  • 您的答案中没有提到的是结果是一个数组。我警告其他任何人,只要您接受了您的回复并进行了处理(请注意,不要单击链接)。 (2认同)

Per*_*ell 8

Rails 文档(https://api.rubyonrails.org/classes/ActionController/Parameters.html#method-i-require)中提出的解决方案是:

def point_code
  params.require(:point_code).permit(:guid).tap do |point_code_params|
    point_code_params.require(:guid) # SAFER
  end
end
Run Code Online (Sandbox Code Playgroud)


Edv*_*rdM 6

好吧,不漂亮,但应该做的伎俩.假设你有params:foo,:bar和:baf你想要所有的东西.你可以说

def thing_params
  [:foo, :bar, :baf].each_with_object(params) do |key, obj|
    obj.require(key)
  end
end
Run Code Online (Sandbox Code Playgroud)

each_with_object返回obj,初始化为params.使用相同的params obj,你依次需要每个键,最后返回对象.不漂亮,但适合我.

  • 这段代码相当于`def thing_params; params.require(:BAF); end`.请参阅Vox的[上面的评论](/sf/ask/1574151491/#comment67090809_24411532). (4认同)