2012-03-20 21 views
43

Tôi mới sử dụng đường ray và tôi không hiểu sự khác biệt giữa việc sử dụng phương pháp + lưu mới và phương pháp tạo.Sự khác biệt về đường ray giữa mới + lưu và tạo

def create 
    @item = Item.new(params[:item]) 

    respond_to do |format| 
     if @item.save 
     format.html { redirect_to @item, notice: 'Item was successfully created.' } 
     format.json { render json: @item, status: :created, location: @item } 
     else 
     format.html { render action: "new" } 
     format.json { render json: @item.errors, status: :unprocessable_entity } 
     end 
    end 
end 

và:

def create 

    respond_to do |format| 
     if Item.create(params[:item]) 
     format.html { redirect_to @item, notice: 'Item was successfully created.' } 
     format.json { render json: @item, status: :created, location: @item } 
     else 
     format.html { render action: "new" } 
     format.json { render json: @item.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

Trả lời

38

Bên create gọi new sau đó save anyway:

def create(attributes = nil, options = {}, &block) 
    if attributes.is_a?(Array) 
     attributes.collect { |attr| create(attr, options, &block) } 
    else 
     object = new(attributes, options, &block) 
     object.save 
     object 
    end 
    end 
3

khi bạn sử dụng, đường ray thực sự đang tạo ra các hồ sơ nhưng không tiết kiệm nó, vì vậy trong quá trình này bạn cũng có thể gán smth

@item = Item.new(params[:item]) 

nhưng khi bạn sử dụng:

if Item.create(params[:item]) 
..... 

it wi sẽ ngay lập tức tạo và lưu

bạn có thể kiểm tra xem nó với rails c

+0

ok nhưng trong trường hợp của tôi, có sự khác biệt giữa việc sử dụng mới + lưu hoặc chỉ tạo trực tiếp? –

+0

không, không có sự khác biệt, cả hai đều đang làm cùng một công việc –

12

new tạo ra các đối tượng nhưng không lưu nó.

create tạo ra các đối tượng lưu nó, ví dụ: .new.save

create! tạo ra các đối tượng và cố gắng để lưu nó nhưng đặt ra một ngoại lệ nếu kiểm chứng thực thất bại, ví dụ .new.save!

Một trong những mục gây nhầm lẫn là ở trên là các hành động bạn thực hiện trên đối tượng, nhưng tên tương tự cũng được cung cấp cho các phương pháp điều khiển, đặc biệt là trong môi trường RESTful. Ví dụ bạn có một hành động tạo .... tạo ra một đối tượng mới, và sau đó lưu nó và một hành động khác tạo ra một đối tượng tạo ra.

Nếu bạn đang tự hỏi "tại sao tạo một đối tượng nếu tôi không lưu nó?" xem xét điều này - hệ thống 'cố gắng' để lưu đối tượng - nhưng xác thực ngăn chặn nó và người dùng được yêu cầu điền vào nhiều thông tin hơn trên biểu mẫu, có thể là các trường bắt buộc. Một trong những muốn đối tượng vẫn được tạo ra (.new) trong khi điều này đang xảy ra và nó sẽ giữ các giá trị đã được giao cho đến nay. Tuy nhiên nó không thực sự nhận được save d cho đến khi nó vượt qua các xác nhận là tốt.

97

Mặc dù nó là đúng rằng create cuộc 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.

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.

+0

"Nếu bạn sử dụng tạo logic phân nhánh, bạn có nguy cơ bị lỗi thầm lặng không phải là trường hợp nếu bạn sử dụng mới + lưu". Cám ơn vì cái này! – jacoulter

+0

Để xác thực đối tượng và sử dụng viết tắt: '.create (...). Valid? ' Nó sẽ trả về true và tạo đối tượng hoặc trả về false và không làm gì cả. – neonmate

+0

Tôi có quyền nói rằng tốt hơn là 'mới' và' lưu' trong các phương thức? @ nmott là những gì bạn có nghĩa là bằng HTML? –

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