Raylar 4 - Güçlü Parametreler - İç İçe Nesneler


144

Çok basit bir sorum var. Ama şu ana kadar bir çözüm bulamadık.

İşte sunucuya gönderdiğim JSON dizesi:

{
  "name" : "abc",
  "groundtruth" : {
    "type" : "Point",
    "coordinates" : [ 2.4, 6 ]
  }
}

Yeni izin yöntemini kullanarak, ben var:

params.require(:measurement).permit(:name, :groundtruth)

Bu hiçbir hata nullatmaz , ancak oluşturulan veritabanı girişi groundtruth değeri yerine içerir.

Sadece ayarladıysam:

params.require(:measurement).permit!

Her şey beklendiği gibi kaydedilir, ancak elbette bu, güçlü parametrelerin sağladığı güvenliği öldürür.

Çözümleri, dizilere nasıl izin verileceğini buldum, ancak iç içe nesneleri kullanarak tek bir örnek değil. Bu bir şekilde mümkün olmalı, çünkü oldukça yaygın bir kullanım örneği olmalıdır. Peki, nasıl çalışır?



1
@vinodadhikary Doğruydu… Bence OP'nin kafası karışık. İç içe özniteliklere izin vermek istediğinizde göründüğü kadar garip, dizi içindeki iç içe nesnenin özniteliklerini belirtirsiniz. Diğer yandan, birden fazla nesnenin iç içe geçmesini istiyorsanız, onu bir karma içine sarıyorsunuz… api.rubyonrails.org/classes/ActionController/… ve github.com/rails/rails/blob/master/actionpack/lib/…
j03w

@ j03w, Kaynağa bağlantı için teşekkürler. Şimdi açık. Bu bulguya bir cevap eklemelisiniz çünkü bence birçok insana yardımcı olacak.
vee

Yanıtlar:


181

Yuvalanmış özniteliklere izin vermek istediğinizde göründüğü kadar garip bir dizi içindeki yuvalanmış nesnenin özniteliklerini belirtirsiniz. Senin durumunda

@RafaelOliveira tarafından önerilen şekilde güncelleme

params.require(:measurement)
      .permit(:name, :groundtruth => [:type, :coordinates => []])

Öte yandan, birden fazla nesnenin iç içe geçmesini istiyorsanız, bunu bir karma içine sarıyorsunuz… bunun gibi

params.require(:foo).permit(:bar, {:baz => [:x, :y]})


Raylar aslında bu konuda oldukça iyi belgelere sahiptir: http://api.rubyonrails.org/classes/ActionController/Parameters.html#method-i-permit

Daha fazla açıklama için, kendi başına permitve strong_parameterskendisinin uygulanmasına bakabilirsiniz : https://github.com/rails/rails/blob/master/actionpack/lib/action_controller/metal/strong_parameters.rb#L246-L247


5
her iki durum da bu cevapta aynıdır, aslında, sadece süslü parantezlerin {: groundtruth => [...]} etrafında isteğe bağlı olması; Bu bir karma ama yorumlayıcı, açık kıvırcık parantezler olmadan karma'nın nerede başladığını ve biteceğini belirleyebilir.
konuşma

İç içe öznitelik dizileri, iç içe özniteliklere izin vermez. Yuvalanmış öznitelikler ve attr_accessor uygulamamda "İzinsiz parametreler" olarak listeleniyor. Hala güvenli bir çözüm arıyoruz.
Katarzyna

Birden çok iç içe nesne olması durumunda, bunun için kimliğin çalışmasına da izin vermelisiniz. Daha fazla bilgi için: stackoverflow.com/questions/18308714/…
Fabrice Carrega

1
Bu yalnızca BİR yuvalanmış öznitelik kümesine izin verir. Bu, bire çok durumunda işe yaramaz.
AKWF

23

Bu öneriyi benim durumumda yararlı buldum:

  def product_params
    params.require(:product).permit(:name).tap do |whitelisted|
      whitelisted[:data] = params[:product][:data]
    end
  end

Xavier'in github hakkındaki yorumunun bu linkini kontrol edin .

Bu yaklaşım tüm parametrelerin [: ölçüm] [: yerçekimi] nesnesini beyaz listeye alır.

Orijinal soru özelliklerini kullanma:

  def product_params
    params.require(:measurement).permit(:name, :groundtruth).tap do |whitelisted|
      whitelisted[:groundtruth] = params[:measurement][:groundtruth]
    end
  end

4
Sadece bir yan not, Bu hala günlükte izinsiz parametreler olarak gösterilecek, ancak model yine de bunları kabul edecektir.
Weston Ganger

5
Rails 4'ten emin değilim ama Rails 5 permit!projemde beyaz listeye alınmayı çağırmalıyım yoksa dokunduktan sonra izinsiz kaldı. Bu durumdaparams[:measurement][:groundtruth].permit!
nayiaw

@nayiaw da izinsiz mesajı alıyorum ama ekleyerek permit!bu hata NoMethodError (undefined method iznini artırıyor ! ' # <Dizi: 0x007f80cb71ea00>) için: ``
wuliwong

@wuliwong permit!yöntemi içinde mevcut değil Array. Erişmek için ilgili sınıf örneğine erişmeniz gerekecek permit!(bir süredir sınıf adını unuttum, ancak bu sayfayaActionController::Parameters dayalı bir şey ).
nayiaw

8

Yuvalanmış bir nesneye izin verme:

params.permit( {:school => [:id , :name]}, 
               {:student => [:id, 
                            :name, 
                            :address, 
                            :city]},
                {:records => [:marks, :subject]})

0

Rails 5 ise, yeni hash gösterimi nedeniyle: params.permit(:name, groundtruth: [:type, coordinates:[]])iyi çalışır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.