Различия в рельсах между новыми + save и create
Я новичок в рельсах, и я не понимаю различий между использованием новых методов + save и методом create.
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
и
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
Ответы
Ответ 1
Внутренне create
вызывает new
, а затем save
в любом случае:
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
Ответ 2
Хотя верно, что create
вызывает new
, а затем save
существует большая разница между двумя альтернативами в их возвращаемых значениях.
save
возвращает либо true
, либо false
в зависимости от того, был ли объект успешно сохранен в базе данных или нет. Это можно затем использовать для управления потоком в соответствии с первым примером в вопросе выше.
create
вернет модель независимо от того, был ли объект сохранен или нет. Это имеет значение для кода выше, поскольку верхняя ветвь оператора if
всегда будет выполняться, даже если объект не прошел проверку и не сохраняется.
Если вы используете create
с логикой ветвления, вы подвергаетесь риску бесшумных сбоев, что не так, если вы используете new
+ save
.
Альтернатива create
может быть полезна в контроллерах, где respond_with
используется для ответов API (JSON/XML). В этом случае наличие ошибок в объекте приведет к возврату ошибок в ответе со статусом unprocessable_entity
, который именно вы хотите получить от API.
Я бы всегда использовал параметр new
+ save
для html, особенно если вы полагаетесь на возвращаемое значение для управления потоком.
Ответ 3
new
создает объект, но не сохраняет его.
create
создает объект и сохраняет его, т.е. .new
и .save
create!
создает объект и пытается его сохранить, но вызывает исключение, если проверки не выполняются, например. .new
и .save!
Один из элементов путаницы - это действия, которые вы выполняете над объектом, но аналогичные имена также передаются методам контроллера, особенно в среде RESTful. Например, у вас есть действие create..., которое создает новый объект, а затем сохраняет его и другое действие create, которое просто создает объект.
Если вам интересно, зачем создавать объект, если я его не сохраню? рассмотрите это: система "пытается" сохранить объект, но проверка предотвращает его, и пользователю предлагается заполнить дополнительную информацию о форме, возможно, обязательных полях. Один хочет, чтобы объект все еще был создан (.new
), пока он продолжается, и он будет удерживать значения, которые были назначены до сих пор. Однако на самом деле он не получает save
d, пока не пройдет проверку.
Ответ 4
когда вы используете, rails на самом деле создает записи, но не сохраняет их, поэтому в процессе вы также можете назначить smth
@item = Item.new(params[:item])
но при использовании:
if Item.create(params[:item])
.....
он немедленно создаст и сохранит
вы можете проверить его с помощью rails c