Để gán khối lượng giá trị cho mô hình ActiveRecord mà không lưu, hãy sử dụng assign_attributes
hoặc attributes=
phương thức. Các phương thức này có sẵn trong Rails 3 và mới hơn. Tuy nhiên, có những khác biệt nhỏ và các vấn đề liên quan đến phiên bản cần chú ý.
Cả hai phương pháp đều tuân theo cách sử dụng này:
@user.assign_attributes{ model: "Sierra", year: "2012", looks: "Sexy" }
@user.attributes = { model: "Sierra", year: "2012", looks: "Sexy" }
Lưu ý rằng không phương thức nào sẽ thực hiện xác nhận hoặc thực hiện các cuộc gọi lại; gọi lại và xác nhận sẽ xảy ra khi save
được gọi.
Đường ray 3
attributes=
khác một chút so với assign_attributes
trong Rails 3. attributes=
sẽ kiểm tra xem đối số được truyền cho nó có phải là Hash không và trả về ngay lập tức nếu không;assign_attributes
không có kiểm tra Hash như vậy. Xem tài liệu API phân bổ thuộc tính ActiveRecord để biếtattributes=
.
Mã không hợp lệ sau đây sẽ âm thầm thất bại bằng cách đơn giản trả về mà không đặt các thuộc tính:
@user.attributes = [ { model: "Sierra" }, { year: "2012" }, { looks: "Sexy" } ]
attributes=
sẽ âm thầm hành xử như thể các bài tập đã được thực hiện thành công, khi thực sự, chúng không.
Mã không hợp lệ này sẽ đưa ra một ngoại lệ khi assign_attributes
cố gắng xâu chuỗi các khóa băm của mảng kèm theo:
@user.assign_attributes([ { model: "Sierra" }, { year: "2012" }, { looks: "Sexy" } ])
assign_attributes
sẽ đưa ra một NoMethodError
ngoại lệ chostringify_keys
, chỉ ra rằng đối số đầu tiên không phải là Hash. Bản thân ngoại lệ không có nhiều thông tin về nguyên nhân thực tế, nhưng thực tế là một ngoại lệ xảy ra là rất quan trọng.
Sự khác biệt duy nhất giữa các trường hợp này là phương pháp được sử dụng để gán khối lượng: attributes=
âm thầm thành công và assign_attributes
đưa ra một ngoại lệ để thông báo rằng đã xảy ra lỗi.
Các ví dụ này có thể có vẻ khó hiểu và ở một mức độ nào đó, nhưng loại lỗi này có thể dễ dàng xảy ra khi chuyển đổi dữ liệu từ API hoặc thậm chí chỉ sử dụng một loạt chuyển đổi dữ liệu và quên Hash[]
kết quả cuối cùng .map
. Duy trì một số mã 50 dòng ở trên và 3 hàm bị xóa khỏi gán thuộc tính của bạn và bạn đã có một công thức cho sự thất bại.
Bài học với Rails 3 là thế này: luôn luôn sử dụngassign_attributes
thay vì attributes=
.
Đường ray 4
Trong Rails 4, attributes=
chỉ đơn giản là một bí danh assign_attributes
. Xem tài liệu API phân bổ thuộc tính ActiveRecord để biếtattributes=
.
Với Rails 4, một trong hai phương pháp có thể được sử dụng thay thế cho nhau. Việc không vượt qua Hash là đối số đầu tiên sẽ dẫn đến một ngoại lệ rất hữu ích:ArgumentError: When assigning attributes, you must pass a hash as an argument.
Xác nhận
Nếu bạn đang thực hiện các bài tập trước chuyến bay để chuẩn bị cho một save
, bạn cũng có thể quan tâm đến việc xác nhận trước khi lưu. Bạn có thể sử dụng valid?
và invalid?
phương pháp cho việc này. Cả hai trả về giá trị boolean. valid?
trả về true nếu mô hình chưa được lưu vượt qua tất cả các xác nhận hoặc false nếu nó không. invalid?
chỉ đơn giản là nghịch đảo củavalid?
valid?
có thể được sử dụng như thế này:
@user.assign_attributes{ model: "Sierra", year: "2012", looks: "Sexy" }.valid?
Điều này sẽ cung cấp cho bạn khả năng xử lý bất kỳ vấn đề xác nhận trước khi gọi save
.