Создание действия внутри другого контроллера

1 Bryon Finke [2013-09-01 19:39:00]

Я пытаюсь создать нового пользователя внутри контроллера для моего класса Request, но имею некоторые трудности. Ниже приводится мое действие "create" внутри моего контроллера запросов. Я понимаю, что не могу просто вызвать User.new, но не знаю, как структурировать правильное POST-действие.

def create
  @request = Request.new(params[:request])
  @user = User.find_by_email(@request.email)
  if @user.present?
    @request.user_id = @user.id
    @request.save
  else
    user = User.new
    user.email = @request.email
    user.zip = @request.zip
    user.save
    @request.user_id = user.id
    @request.save
  end

  respond_to do |format|
    if @request.save
      UserMailer.request_confirmation(@request).deliver
      UserMailer.request_notification(@request).deliver
      format.html { redirect_to confirmation_url }
      format.json { render json: @request, status: :created, location: @request }
    else
      format.html { render action: "new" }
      format.json { render json: @request.errors, status: :unprocessable_entity }
    end
  end
end

ruby-on-rails controller models rails-models


1 ответ


0 Piotr Imbierowicz [2013-09-01 19:57:00]

Я не знаю, в чем проблема, но вам не нужно вызывать User create POST action (действие от User controller) для создания пользователя.

User.create - "create" - это метод из ActiveRecord :: Base, а не из UserController.

В одном действии (например, Request create action) вы можете создать много объектов ActiveRecord, независимо от того, какой класс они являются.

Существуют различные способы создания базы данных в рельсах. Их можно было вызвать из моделей, контроллеров и других.

@u = User.new
@u.save! # try to save object in DB, if something goes wrong, throws exception

@u = User.create! # creates empty user object in database, '!' causes that if something goes wrong, create throws exception

@u = User.create # it won't throw exception even if object is invalid

@u = User.new
@u.email = @request.email
if @u.save
   # ok, it in DB
else
   # something goes wrong, e.g. rails validations
end