Как получить идентификатор вновь созданной записи в rails и связать идентификатор с другой моделью - Rails - PullRequest
0 голосов
/ 30 августа 2018

Я создаю приложение rails, подключенное к приложению реагирования. Приложение рельсы имеет четыре модели. Для аргументов здесь давайте представим, что у него есть две модели: отправитель и адрес. Отправитель принадлежит к адресу, а адрес имеет множество отправителей. Поэтому у отправителя есть внешний_ключ адресного_идентификатора. Когда отправитель регистрируется для новой учетной записи, он также создает адрес. Я пытаюсь что-то встроить в мой контроллер rails, чтобы при создании нового адреса он ассоциировался со столбцом address_id отправителя. Я пытался создать свое собственное уникальное решение, основанное на решениях этого потока рельсов. , но у меня не было большого успеха. Я реализовал следующее в моем контроллере адресов:

class AddressesController < ActionController::API
    
    def show
        @address = Address.find(params[:id])
    end 

    def create 
        success = false
        address = Address.new(address_params)
        sender = @sender
        if address.save
            address_id = address.sender.build({address_id: address.id })
            success = true if !address_id.empty?
        else
            render json: { errors: address.errors.full_messages }, status: :bad_request
        end
        if success = true  
            render json: {status: 'address created successfully'}, status: :created 
        else  
            render('edit')
        end
    end 

    def address_params
        params.require(:address).permit(:streetname, :zipcode, :city, :country)
    end
end

И я получаю эту ошибку в терминале:

  
NoMethodError (undefined method `sender' for #<Address:0x00007f93b2576050>
Did you mean?  senders
               senders=
               send):
  
app/controllers/addresses_controller.rb:21:in `create'

Итак, я поместил attr_accessor в мой контроллер отправителей:

class SendersController < ApplicationController
attr_accessor :sender    
    def show
        @sender = Sender.find(params[:id])
    end 

    def create
        @sender = Sender.new(sender_params)
        if @sender.save 
          render json: {status: 'sender created successfully'}, status: :created
        else
          render json: { errors: sender.errors.full_messages }, status: :bad_request
        end
    end 
    
    def sender_params
        params.require(:sender).permit(:userid, :name, :email, :photourl, :address_id)
    end
end

Я чувствую, что здесь все усложняется. Так что мне очень нужна помощь с этим. Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 30 августа 2018

NoMethodError (неопределенный метод `отправитель 'для)

Во-первых, ошибка вызвана тем, что у вас есть has_many отношение к sender, поэтому оно должно быть senders, а не sender

address.senders.build

Когда отправитель регистрируется для новой учетной записи, он создает адрес как Что ж. Я пытаюсь построить что-то в моем контроллере рельсов, посредством чего при создании нового адреса он связывается со столбцом address_id отправителя.

Во-вторых, ваш подход неверен. Вы можете использовать доступные методы для связи belongs_to. Например, в вашей ситуации вы можете позвонить @sender.build_address

address = @sender.build_address(address_params)

Метод build_association возвращает новый объект связанного тип. Этот объект будет создан из переданных атрибутов, и ссылка через внешний ключ этого объекта будет установлена ​​, но связанный объект еще не будет сохранен.

Итак, наконец, создание будет выглядеть как показано ниже (после удаления ненужного кода)

def create 
  address = @sender.build_address(address_params)

  if address.save
    render json: {status: 'address created successfully'}, status: :created
  else
    render json: { errors: address.errors.full_messages }, status: :bad_request
  end
end 
0 голосов
/ 30 августа 2018

Вам не нужно вручную устанавливать идентификатор, если вы создаете запись через ассоциацию:

address.sender.build({address_id: address.id })

Может быть просто

address.sender.build

И рельсы назначат вам идентификатор.

...