【问题标题】:Rails API - React: Site ID returns null on POSTRails API - React:站点 ID 在 POST 上返回 null
【发布时间】:2020-02-12 06:43:42
【问题描述】:

我的应用有 Rails API 后端和 React 前端。

ERD 只有三个参数:用户has_many :sites、站点belongs_to :userhas_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>]

但是,当我尝试将页面发布到站点时,站点 ID 会返回 nil

#<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) in Rails? Due to the routes or the controller?

Validation failed Class must exist

但在我的特定情况下都不起作用。

站点控制器.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 的人能指出我所缺少的。

【问题讨论】:

  • 我可能不完全理解发生了什么,但您不想要 Site.create 而不是 Site.new 吗? Site.new 在保存之前不会创建 id。

标签: ruby-on-rails


【解决方案1】:

问题在于您的create 操作。正如zakariah1 指出的那样,Site.new 只会初始化Site,您需要使用Site.create 将其保存在数据库中。

此外,您的操作中不需要此代码 @current_user.sites &lt;&lt; @site。因为你的site_paramsuser_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

【讨论】:

  • 感谢您的回答。这是正确的,但我确实必须通过 @current_user.sites &lt;&lt; @site 才能使其工作,但我在回复中得到了 site_id
  • @RHBlanchfield 我认为这不是一个添加的好习惯,你可以试试这行@site.user_id = @current_user.id 而不是@current_user.sites &lt;&lt; @site 看看是否可行?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-14
  • 1970-01-01
  • 1970-01-01
  • 2016-04-20
  • 2021-04-09
  • 1970-01-01
  • 2013-09-05
相关资源
最近更新 更多