2008-12-31 36 views
153

Vì vậy, tôi đã thấy mọi người đang sử dụng .build, .create và .create! trong bộ điều khiển của họ ngày càng nhiều. Sự khác biệt từ việc sử dụng .new và passig đối tượng param'd và sau đó. Save? Có ưu và nhược điểm nào không? Việc sử dụng các phương pháp khác này có mang lại lợi ích không?Sự khác nhau giữa .build, .create và .create! và khi nào chúng nên được sử dụng?

Trả lời

216

Có một vài sự khác biệt, nhưng chúng không lớn:

  1. .create tương đương với .new Tiếp theo .save. Nó chỉ gọn gàng hơn.
  2. .create! tương đương với .new theo sau là .save! (ném lỗi nếu lưu không thành công). Đó cũng chỉ là một chút ngắn hơn một chút
  3. Tôi nghĩ rằng .buildchủ yếu là bí danh cho .new. Nó works one way in Rails 3 và một cách khác trong Rails < 3.x

Phần quan trọng nhất, tuy nhiên, đó là những phương pháp này có thể được gọi thông qua một hiệp hội (has_many, vv) để tự động liên kết hai mô hình.

+1

Tôi đã chọn câu trả lời này là câu trả lời đúng nhất vì đề cập đến việc có thể liên kết các mô hình được liên kết với họ - đó là sự khác biệt thú vị và quan trọng mà tôi nghĩ đến khi sử dụng .new và .save. Việc này tốn thêm một chút. Cảm ơn. –

+11

Làm rõ nhỏ trên 3 - xây dựng không chỉ mới hơn một chút - nó còn thiết lập liên kết liên kết. –

+0

Làm thế nào để bạn gọi thông qua một hiệp hội trong một mối quan hệ Có-Nhiều? –

6

#create là phiên bản mới hơn và lưu lại. #create! là ném ngoại lệ nếu xác thực không dương.

5

Tôi muốn trả lời các câu hỏi trên. Ngoài ra, đối với create, bạn không thể vượt qua false làm đối số mà bạn có thể thực hiện với save. Đi qua false như một cuộc tranh cãi sẽ bỏ qua tất cả đường ray kiểm chứng thực

31

Mặc dù nó là đúng rằng create gọi new và sau đó save có một sự khác biệt lớn giữa hai lựa chọn thay thế trong các giá trị trở lại của họ.

Save trả lại true hoặc false tùy thuộc vào việc đối tượng có được lưu thành công vào cơ sở dữ liệu hay không. Điều này sau đó có thể được sử dụng để kiểm soát dòng chảy theo ví dụ đầu tiên trong câu hỏi trên.

Create sẽ trả về mô hình bất kể đối tượng có được lưu hay không. Điều này có ý nghĩa đối với mã ở trên trong đó nhánh trên cùng của câu lệnh if sẽ luôn được thực thi ngay cả khi đối tượng không xác nhận hợp lệ và không được lưu.

Nếu bạn sử dụng create với logic phân nhánh bạn có nguy cơ bị lỗi thầm lặng, không phải trường hợp nếu bạn sử dụng new + save.

create! không bị cùng một vấn đề vì nó tăng và ngoại lệ nếu bản ghi không hợp lệ.

Phương án create có thể hữu ích trong bộ điều khiển trong đó respond_with được sử dụng cho phản hồi API (JSON/XML). Trong trường hợp này, sự tồn tại của các lỗi trên đối tượng sẽ làm cho các lỗi được trả về trong phản hồi với trạng thái là unprocessable_entity, chính xác là những gì bạn muốn từ một API.

Tôi sẽ luôn sử dụng tùy chọn new + save cho html, đặc biệt nếu bạn đang dựa vào giá trị trả lại cho kiểm soát luồng.

Các vấn đề liên quan