attr_accessible
dường như không còn làm việc trong mô hình của tôi.
Cách để cho phép gán khối lượng trong Rails 4 là gì?
attr_accessible
dường như không còn làm việc trong mô hình của tôi.
Cách để cho phép gán khối lượng trong Rails 4 là gì?
Câu trả lời:
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_accessible
trong mô hình nữa.
accepts_nested_attributes_for
Để sử dụng accepts_nested_attribute_for
vớ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_attributes
vào Gemfile
. Nếu không, bạn sẽ phải đối mặt với a RuntimeError
.
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.
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
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
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) 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_accessible
mộ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
attr_accessible
cần phải xóa. Điều gì sẽ xảy ra nếu chúng ta giữ nó?