Attr_accessible được sử dụng trong Rails 4 như thế nào?


Câu trả lời:


447

Rails 4 hiện sử dụng các tham số mạnh mẽ .

Bảo vệ thuộc tính bây giờ được thực hiện trong bộ điều khiển. Đây là một ví dụ:

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

  private

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

Không cần phải thiết lập attr_accessibletrong mô hình nữa.

Xử lý accepts_nested_attributes_for

Để sử dụng accepts_nested_attribute_forvới các tham số mạnh, bạn sẽ cần chỉ định các thuộc tính lồng nhau nào sẽ được đưa vào danh sách trắng.

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

Từ khóa là tự giải thích, nhưng chỉ trong trường hợp, bạn có thể tìm thêm thông tin về các tham số mạnh trong hướng dẫn Bộ điều khiển hành động Rails .

Lưu ý : Nếu bạn vẫn muốn sử dụng attr_accessible, bạn cần thêm protected_attributesvào Gemfile. Nếu không, bạn sẽ phải đối mặt với a RuntimeError.


1
Tài liệu không nói rằng attr_accessiblecần phải xóa. Điều gì sẽ xảy ra nếu chúng ta giữ nó?
lulalala

12
Bạn sẽ gặp lỗi nếu bạn không thực hiện một số điều chỉnh cho Gemfile của mình. 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.
người dùng

6
Giải thích tuyệt vời. Tuy nhiên, có vẻ như trong thực tế, điều này di chuyển Rails ra khỏi mô hình béo, bộ điều khiển mỏng, v.v., và hướng tới các mô hình mỏng, và các bộ điều khiển thực sự cồng kềnh. Bạn phải viết tất cả những thứ này cho mọi trường hợp, nó không đọc độc đáo và làm tổ dường như là một nỗi đau. Attr_accessible / attr_accessor cũ trong hệ thống mô hình không bị hỏng và không cần phải sửa. Một bài đăng blog đã quá phổ biến trong trường hợp này.
rcd

1
Bạn không phải xử lý các tham số được phép trong bộ điều khiển của mình. Trong thực tế, đó là một sự vi phạm nguyên tắc trách nhiệm duy nhất. Hãy xem bài đăng trên blog sau đây edelpero.svbussy.com/strong-parameter-the-right-way
Pierre-Louis Gottfrois

3
Vì vậy, phô trương và thường xuyên thay đổi apis, cùng với các nhà sư phạm mới phát hiện lãng phí nhiều giờ của nhà phát triển trong một bản nâng cấp Rails đau đớn khác :-(
Brian Takita

22

Nếu bạn thích attr_accessible, bạn cũng có thể sử dụng nó trong Rails 4. Bạn nên cài đặt nó như gem:

gem 'protected_attributes'

sau đó bạn có thể sử dụng attr_accessible trong các mô hình của bạn như trong Rails 3

Ngoài ra, và tôi nghĩ rằng đó là cách tốt nhất - sử dụng các đối tượng biểu mẫu để xử lý việc gán khối lượng và lưu các đối tượng lồng nhau, và bạn cũng có thể sử dụng đá quý được bảo vệ theo cách đó

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
Khi bạn sử dụng 'tham số mạnh', bạn lọc các tham số trong lớp trình điều khiển và tôi không nghĩ rằng đây là ý tưởng tốt nhất cho tất cả các ứng dụng. Đối với tôi cách tốt nhất để lọc các tham số là sử dụng lớp bổ sung. Và chúng ta có thể sử dụng đá quý '
reserved_attribut

4

Chúng ta có thể sử dụng

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

Trong đó person là Model, bạn có thể truyền mã này vào một phương thức person_params & sử dụng thay cho params [: person] trong phương thức tạo hoặc phương thức khác


2

Bản cập nhật cho Rails 5:

gem 'protected_attributes' 

dường như không còn hoạt động nữa. Nhưng cho:

đá quý 'reserved_attribut_continued'

một sự cố gắng.


1

1) Cập nhật Devise để nó có thể xử lý Rails 4.0 bằng cách thêm dòng này vào Gemfile của ứng dụng của bạn:

gem 'devise', '3.0.0.rc' 

Sau đó thực hiện:

$ bundle

2) Thêm chức năng cũ của attr_accessiblemột lần nữa vào đường ray 4.0

Thử sử dụng attr_accessible và không bình luận này.

Thêm dòng này vào Gemfile của ứng dụng của bạn:

gem 'protected_attributes'

Sau đó thực hiện:

$ bundle
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.