Rails API - React: идентификатор сайта возвращает ноль на POST - PullRequest
0 голосов
/ 15 октября 2019

Мое приложение имеет интерфейс Rails API и интерфейс React.

В ERD есть только три параметра: Пользователь has_many :sites, Сайт belongs_to :user и has_many :pages и Страница belongs_to :site.

Все функции CRUD работают, кроме случаев, когда япопробуйте опубликовать страницу, принадлежащую сайту, в моем бэкенде Active Records.

Если я посмотрю на консоль Rails, я смогу увидеть сайты и пользователя, которым они принадлежат:

#<Site:0x00007fbc9ad9fe28 id: 94, name: "Daffy", category: "test", user_id: 1, created_at: Tue, 15 Oct 2019 13:53:23 UTC +00:00, updated_at: Tue, 15 Oct 2019 13:53:23 UTC +00:00>]

однако, когда я пытаюсь опубликовать страницу на сайте, идентификатор сайта возвращается ноль

#<Page:0x00007fbc9b5069c8 id: 2, content: "\"\"", site_id: nil, created_at: Tue, 15 Oct 2019 10:51:42 UTC +00:00, updated_at: Tue, 15 Oct 2019 10:51:42 UTC +00:00>]

Глядя на инструменты разработчика Chrome, я получаю ошибку 422:

Failed to load resource: the server responded with a status of 422 (Unprocessable Entity)
:3000/users/1/sites/94/pages/:1 

&в сети на вкладке «Предварительный просмотр» я получаю

{site: ["must exist"]}
site: ["must exist"]

Я просмотрел следующие сообщения StackOverflow, связанные с этим:

POST 422 (Unprocessable Entity) в Rails? Из-за маршрутов или контроллера?

и

Проверка не пройдена Класс должен существовать

, но в моем конкретном случае это не помогло.

SitesController.rb

class SitesController < ApplicationController
  before_action :set_site, only: [:show, :update, :destroy]
  before_action :authorize_request, only: [:create]

...

  def create
    @site = Site.new(site_params)
    @current_user.sites << @site
      render json: @site, status: :created
  end

...

    def site_params
      params.require(:site).permit(:name, :category, :user_id)
    end
end

Я занимаюсь этим некоторое время, я надеюсь, что кто-то, кто знает Rails намного лучше, чем я, может указать, что яотсутствует.

1 Ответ

1 голос
/ 15 октября 2019

Проблема в вашем create действии. Как указал zakariah1, Site.new просто инициализирует Site, вам нужно сохранить его в базе данных, используя Site.create.

Кроме того, вам не нужен этот код @current_user.sites << @site втвои действия. Поскольку ваши site_params имеют user_id, ассоциация rails сделает это за вас.

Итак, вот как должны выглядеть ваши контроллеры:

# sites_controller.rb
def create
  @site = Site.new(site_params)
  if @site.save
    render json: @site, status: :created
  else
    # render error
  end
end

...

def site_params
  params.require(:site).permit(:name, :category, :user_id)
end

# pages_controller.rb
def create
  @page = Page.new(page_params)
  if @page.save
    render json: @page, status: :created
  else
    # render error
  end
end

...

def page_params
  params.require(:page).permit(:name, :category, :site_id)
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...