Подтвердить что ты не робот

Различия в рельсах между новыми + 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
4b9b3361

Ответ 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