Attr_accessible Rails 4'te nasıl kullanılır?


Yanıtlar:


447

Rails 4 artık güçlü parametreler kullanıyor .

Öznitelikleri korumak artık kontrolörde yapılır. Bu bir örnektir:

class PeopleController < ApplicationController
  def create
    Person.create(person_params)
  end

  private

  def person_params
    params.require(:person).permit(:name, :age)
  end
end

attr_accessibleArtık modele geçmeye gerek yok.

İle başa çıkmak accepts_nested_attributes_for

accepts_nested_attribute_forGüçlü parametrelerle kullanmak için, hangi yuvalanmış özniteliklerin beyaz listeye alınması gerektiğini belirtmeniz gerekir.

class Person
  has_many :pets
  accepts_nested_attributes_for :pets
end

class PeopleController < ApplicationController
  def create
    Person.create(person_params)
  end

  # ...

  private

  def person_params
    params.require(:person).permit(:name, :age, pets_attributes: [:name, :category])
  end
end

Anahtar kelimeler kendinden açıklayıcıdır, ancak her halükarda, Rails Action Controller kılavuzunda güçlü parametreler hakkında daha fazla bilgi bulabilirsiniz .

Not : Hala kullanmak istiyorsanız attr_accessible, cihazınıza eklemeniz protected_attributesgerekir Gemfile. Aksi takdirde, a RuntimeError.


1
Belge attr_accessiblekaldırılması gerektiğini söylemedi . Saklarsak ne olur?
lulalala

12
Gemfile dosyasında bazı ayarlamalar yapmazsan bir hata alırsın. RuntimeError in MicropostsController#index 'attr_accessible' is extracted out of Rails into a gem. Please use new recommended protection model for params(strong_parameters) or add 'protected_attributes' to your Gemfile to use old one.
kullanıcı

6
Harika bir açıklama. Bununla birlikte, pratikte, görünüşe göre, bu, Rayları yağ modelinden, ince kontrolörden, vb. Bütün bunları her örnek için yazmalısınız, iyi okumaz ve yuvalama bir acı gibi görünüyor. Model sistemdeki eski attr_accessible / attr_accessor kırılmadı ve düzeltilmesine gerek yoktu. Bir blog yayını bu durumda çok popüler oldu.
rcd

1
Denetleyicilerinizde izin verilen parametreleri işlemeniz gerekmez. Aslında bu tek sorumluluk ilkesinin ihlalidir. Aşağıdaki blog yazısına
Pierre-Louis Gottfrois

3
Bu yüzden gimmiky ve sık sık değişen apis, yeni keşfedilen bilgiçliklerle birleştiğinde, başka bir acı verici Rails yükseltmesinde birçok geliştirici saatini boşa harcıyor :-(
Brian Takita

22

Attr_accessible'ı tercih ederseniz, Rails 4'te de kullanabilirsiniz. Gem gibi yüklemelisiniz:

gem 'protected_attributes'

Bundan sonra Rails 3 gibi modellerde attr_accessible kullanabilirsiniz

Ayrıca, ve bu kütle atama ile uğraşmak ve iç içe nesneleri kaydetmek için form nesnelerini kullanarak en iyi yol olduğunu düşünüyorum ve ayrıca korumalı_attributes gem bu şekilde kullanabilirsiniz

class NestedForm
   include  ActiveModel::MassAssignmentSecurity
   attr_accessible :name,
                   :telephone, as: :create_params
   def create_objects(params)
      SomeModel.new(sanitized_params(params, :create_params))
   end
end

1
'Güçlü parametreler' kullandığınızda denetleyici katmanındaki parametreleri filtreliyorsunuz ve bunun tüm uygulamalar için en iyi fikir olduğunu düşünmüyorum. Benim için parametreleri filtrelemenin en iyi yolu ek katman kullanmaktır. Ve biz bu katmanı yazmak için 'korumalı_uzunluklar'
taşını kullanabiliriz

4

Kullanabiliriz

params.require(:person).permit(:name, :age)

burada kişi Model ise, bu kodu person_params yönteminde geçirebilir ve parametre [: person] yerine create yönteminde veya else yönteminde kullanabilirsiniz.


2

Rails 5 için bir güncelleme:

gem 'protected_attributes' 

artık işe yaramıyor gibi görünüyor. Ama verin:

gem 'korumalı_attributes_continued'

bir deneme.


1

1) Bu satırı uygulamanızın Gemfile'ına ekleyerek Rails 4.0'ı işleyebilmesi için Düzenlemeyi Güncelle:

gem 'devise', '3.0.0.rc' 

Sonra yürütün:

$ bundle

2) attr_accessibleYine eski işlevselliğini raylara 4.0 ekleyin

Kullanmaya çalışın attr_accessibleve bunu yorumlamayın.

Bu satırı uygulamanızın Gemfile dosyasına ekleyin:

gem 'protected_attributes'

Sonra yürütün:

$ bundle
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.