我收到了一个JSON包,如:
{
"point_code" : { "guid" : "f6a0805a-3404-403c-8af3-bfddf9d334f2" }
}
我想告诉Rails,point_code
和guid
都是必需的,而不仅仅是允许的。
这段代码似乎有用,但我不认为这是好习惯,因为它返回一个字符串,而不是完整的对象:
params.require(:point_code).require(:guid)
我有什么想法可以做到这一点?
答案 0 :(得分: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
示例:强>
def create
@point_code = PointCode.new(point_code_params)
end
答案 1 :(得分:7)
截至2015年(RoR 5.0+),您可以将一系列密钥传递给rails中的require
方法:
params.require([:point_code, :guid])
http://api.rubyonrails.org/classes/ActionController/Parameters.html#method-i-require
答案 2 :(得分:6)
好的,不漂亮,但应该做的伎俩。假设你有params:foo,:bar和:baf你想要所有的东西。你可以说
def thing_params
[:foo, :bar, :baf].each_with_object(params) do |key, obj|
obj.require(key)
end
end
each_with_object
返回obj,它被初始化为params。使用相同的params obj,你依次需要每个键,最后返回对象。不漂亮,但适合我。
答案 3 :(得分:1)
尽管许多答案都向您展示了如何获得所需的信息,但我想补充一下这些答案,并建议您使用before_action
。如果缺少必需的参数,require
将自动返回400错误
class SomeController < ApplicationController
before_action :ensure_valid_params, only: :index
def index
# do your stuff
end
private
def ensure_valid_params
params.require(:some_required_param)
end
end
答案 4 :(得分:0)
require
需要一个参数。因此,除非您覆盖require
方法,否则无法传递多个键。您可以通过操作中的其他逻辑实现您想要的目标:
def action
raise ActionController::ParameterMissing.new("param not found: point_code") if point_params[:point_code].blank?
raise ActionController::ParameterMissing.new("param not found: guid") if point_params[:point_code][:guid].blank?
<do your stuff>
end
def point_params
params.permit(point_code: :guid)
end
答案 5 :(得分:0)
这个问题出现在我的Google搜索中,是一种不同的情况,例如,当使用“ multiple:true”时,如下所示:
<%= form.file_field :asset, multiple: true %>
与问题完全不同的情况。但是,为了帮助您,Rails 5+中的一个工作示例就是这样:
form_params = params.require(:my_profile).permit({:my_photos => []})
答案 6 :(得分:0)
Rails文档中提出的解决方案是:
def point_code
params.require(:point_code).permit(:guid).tap do |point_code_params|
point_code_params.require(:guid) # SAFER
end
end