Phân biệt NEW, CREATE, BUILD và SAVE trong Rails

Viết blog để thay đổi không khí, cũng như là một cách để lưu giữ kiến thức lâu hơn. Nội dung bài viết bắt nguồn từ chính những thắc mắc của bản thân trong quá trình học nên chắc sẽ phù hợp hơn với những ai cũng đang mới học Rails như mình. Có gì

Viết blog để thay đổi không khí, cũng như là một cách để lưu giữ kiến thức lâu hơn.
Nội dung bài viết bắt nguồn từ chính những thắc mắc của bản thân trong quá trình học nên chắc sẽ phù hợp hơn với những ai cũng đang mới học Rails như mình.
Có gì sai sót mọi người cùng góp ý và chia sẻ nha ^^

New, Build, Create


Đặc điểm chung :

Đều dùng để tạo mới object trong Rails.

Create method

Truyền data vào và Save luôn

VD:

defnew@book=Book.create(title:"RoR 5 超入門", author:"掌田津耶乃")#title là RoR 5 超入門,author là 掌田津耶乃end

Hoặc

defcreate@book=Book.create(book_params)end

New method

New method truyền data vào nhưng không save. Muốn tạo object thì cần kết hợp với cả save method nữa.

defnew@book=Book.newend

Hoặc

defnew@book=Book.new(title:"羅生門", author:"芥川龍之介")#title là RoR 5 超入門,author là 掌田津耶乃end

Kết hợp với save method để lưu data

defnew@book=Book.newend

Build method

Build method giống New ở chỗ đều có khả năng tạo object mới.

Nhưng khi tạo biến mới thì Build luôn đi cùng với user_id, điều mà New không làm được.

Ví dụ:
Giả sử ta có model User và model Post, một User có khả năng tạo nhiều Post.
Trong trường hợp này thì ở file user.rb sẽ có quan hệ với post là 「has_many :posts」.
Khi đó, nếu dùng New method để tạo biến Post instance mới thì code sẽ như sau:

defcreate@post=Post.new(post_params)@post.user_id = current_user.id
    @post.save
end

Đoạn code khá dài dòng. Thay vào đó, ta có thể dùng Build method để viết chỉ trong 1 dòng mà kết quả tương tự;

defcreate@post= current_user.posts.build(post_params)end

Khá ngắn gọn phải không nào ! 😁😁

Tại sao lại phải chia ra nhiều cách dùng như vậy ?

Tại sao lại phải dùng New trong khi có thể dùng Create ?

Khi ta tạo ra một biến instance và muốn thao tác với nó trong quá trình save thì phải dùng New, chứ không dùng Create được.
Vì nếu dùng Create thì nó sẽ save luôn mà không kịp thao tác gì cả,

VD: Dùng hàm if

defcreate@user=User.new(user_params)#Tạo biến instanceif@user.save
    redirect_to @user, notice:'User created'else
    render :new#Nếu Save thất bại thì render :newendend

==> Tạo biến instance, nếu save thành công thì redirect_to @user, nếu save thất bại thì render :new

Tổng kết

Một bức ảnh thay cho tóm tắt bài viết. 🤗

image.png

Nguồn: viblo.asia

Bài viết liên quan

WebP là gì? Hướng dẫn cách để chuyển hình ảnh jpg, png qua webp

WebP là gì? WebP là một định dạng ảnh hiện đại, được phát triển bởi Google

Điểm khác biệt giữa IPv4 và IPv6 là gì?

IPv4 và IPv6 là hai phiên bản của hệ thống địa chỉ Giao thức Internet (IP). IP l

Check nameservers của tên miền xem website trỏ đúng chưa

Tìm hiểu cách check nameservers của tên miền để xác định tên miền đó đang dùn

Mình đang dùng Google Domains để check tên miền hàng ngày

Từ khi thông báo dịch vụ Google Domains bỏ mác Beta, mình mới để ý và bắt đầ