强参数需要多个

时间:2014-03-18 18:23:48

标签: ruby-on-rails ruby ruby-on-rails-4

我收到了一个JSON包,如:

{
  "point_code" : { "guid" : "f6a0805a-3404-403c-8af3-bfddf9d334f2" }
}

我想告诉Rails,point_codeguid都是必需的,而不仅仅是允许的。

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

params.require(:point_code).require(:guid)

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

7 个答案:

答案 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