webentwicklung-frage-antwort-db.com.de

Starke Parameter erfordern mehrere

Ich erhalte ein JSON-Paket wie:

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

Ich möchte Rails mitteilen, dass sowohl point_code als auch guid erforderlich sind und nicht nur erlaubt sind. 

Dieser Code scheint zu funktionieren, aber ich denke nicht, dass es eine gute Praxis ist, da er eine Zeichenfolge und nicht das vollständige Objekt zurückgibt:

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

Irgendwelche Ideen, wie ich das machen könnte?

28
Rob

Ich hatte ein ähnliches Bedürfnis und was ich tat, war

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

Beispiel:

def create
  @point_code = PointCode.new(point_code_params)
end
24
sarunw

Ab 2015 (RoR 5.0+) können Sie eine Reihe von Schlüsseln an die require -Methode in Rails übergeben:

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

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

7
raveren

OK, ist nicht hübsch, aber sollte den Trick tun. Angenommen, Sie haben params: foo,: bar und: baf, die Sie alles für ein Ding benötigen würden. Du könntest sagen

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

each_with_object gibt obj zurück, das als Parameter initialisiert wird. Wenn Sie die gleichen Parameter verwenden, benötigen Sie nacheinander alle diese Schlüssel und geben das Objekt zurück. Nicht hübsch, aber funktioniert für mich.

6
EdvardM

Die in der Rails Dokumentation vorgeschlagene Lösung lautet:

def point_code
  params.require(:point_code).permit(:guid).tap do |point_code_params|
    point_code_params.require(:guid) # SAFER
  end
end
1

require nimmt einen Parameter. Es gibt also keine Möglichkeit, mehrere Schlüssel zu übergeben, es sei denn, Sie überschreiben die require-Methode. Sie können erreichen, was Sie mit einer zusätzlichen Logik in Ihrer Aktion wollen:

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
0
usha

Diese Frage wurde in meiner Google-Suche nach einem anderen Fall angezeigt, z. B. bei Verwendung eines "multiple: true" wie in:

<%= form.file_field :asset, multiple: true %>

Welches ist ein ganz anderer Fall als die Frage. Im Interesse der Unterstützung ist hier jedoch ein Arbeitsbeispiel in Rails 5+ davon:

form_params = params.require(:my_profile).permit({:my_photos => []})
0
Nate Flink