首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >{“用户”:[“必须存在”]} Rails嵌套资源和身份验证错误

{“用户”:[“必须存在”]} Rails嵌套资源和身份验证错误
EN

Stack Overflow用户
提问于 2017-08-10 03:14:51
回答 1查看 549关注 0票数 0

我对Rails比较陌生,而且我有一个我想使用的相对简单的设置。我有用户、列表和项目。每个用户都有许多列表,每个列表都有许多项。我在登录后创建项目时遇到问题。

用户模型:

代码语言:javascript
运行
AI代码解释
复制
class User < ApplicationRecord
  include Authentication
  has_many :examples
  has_many :lists
  has_many :items
end

列表模型:

代码语言:javascript
运行
AI代码解释
复制
class List < ApplicationRecord
  belongs_to :user
  has_many :items
end

项目模型:

代码语言:javascript
运行
AI代码解释
复制
class Item < ApplicationRecord
  belongs_to :user
  belongs_to :list
end

以下是相关的路由:

代码语言:javascript
运行
AI代码解释
复制
Rails.application.routes.draw do
  resources :lists do
    resources :items
  end

我可以使用以下控制器创建/读取/更新/删除列表:

代码语言:javascript
运行
AI代码解释
复制
class ListsController < ProtectedController
  before_action :set_list, only: [:show, :update, :destroy]

  # GET /lists
  def index
    @lists = current_user.lists

    render json: @lists
  end

  # GET /lists/1
  def show
    render json: List.find(params[:id])
  end

  # POST /lists
  def create
    @list = current_user.lists.build(list_params)

    if @list.save
      render json: @list, status: :created, location: @list
    else
      render json: @list.errors, status: :unprocessable_entity
    end
  end

  # PATCH/PUT /lists/1
  def update
    if @list.update(list_params)
      render json: @list
    else
      render json: @list.errors, status: :unprocessable_entity
    end
  end

  # DELETE /lists/1
  def destroy
    @list.destroy
  end

  private
    # Use callbacks to share common setup or constraints between actions.
    def set_list
      @list = current_user.lists.find(params[:id])
    end

    # Only allow a trusted parameter "white list" through.
    def list_params
      params.require(:list).permit(:name)
    end
end

但是,我无法成功创建项目。下面是我的项目控制器:

代码语言:javascript
运行
AI代码解释
复制
class ItemsController < ProtectedController
  before_action :set_item, only: [:show, :update, :destroy]

  # GET /items
  def index
    @items = current_user.items

    render json: @items
  end

  # GET /items/1
  def show
    render json: @item
  end

  # POST /items
  def create
    @list = List.find(params[:list_id])
    @item = @list.items.create(item_params)

    if @item.save
      render json: @item, status: :created, location: @item
    else
      render json: @item.errors, status: :unprocessable_entity
    end
  end

  # PATCH/PUT /items/1
  def update
    if @item.update(item_params)
      render json: @item
    else
      render json: @item.errors, status: :unprocessable_entity
    end
  end

  # DELETE /items/1
  def destroy
    @item.destroy
  end

  private
    # Use callbacks to share common setup or constraints between actions.
    def set_item
      @item = current_user.items.find(params[:id])
    end

    # Only allow a trusted parameter "white list" through.
    def item_params
      params.require(:item).permit(:name, :quantity, :price, :store, :category, :notes, :user_id, :list_id)
    end
end

我登录,创建一个列表,然后尝试将一个项目发布到该列表中,但得到以下错误:{"user":["must exist"]}

下面是来自服务器的消息:

代码语言:javascript
运行
AI代码解释
复制
Started POST "/lists/4/items" for 127.0.0.1 at 2017-08-09 22:47:19 -0400
Processing by ItemsController#create as */*
  Parameters: {"item"=>{"name"=>"Test Item", "quantity"=>"1", "price"=>"9.99", "store"=>"Fruit Center", "category"=>"Dairy", "notes"=>"Important Note"}, "list_id"=>"4"}
  User Load (0.3ms)  SELECT  "users".* FROM "users" WHERE "users"."token" = $1 LIMIT $2  [["token", "27e3e2a67d86cb9d3f46d20651370b74"], ["LIMIT", 1]]
  List Load (0.3ms)  SELECT  "lists".* FROM "lists" WHERE "lists"."id" = $1 LIMIT $2  [["id", 4], ["LIMIT", 1]]
   (0.1ms)  BEGIN
   (0.2ms)  COMMIT
   (0.1ms)  BEGIN
   (0.1ms)  ROLLBACK
[active_model_serializers] Rendered ActiveModel::Serializer::Null with ActiveModel::Errors (0.06ms)
Completed 422 Unprocessable Entity in 8ms (Views: 0.5ms | ActiveRecord: 1.1ms)

或者,我尝试将item的创建操作更改为以下内容:

代码语言:javascript
运行
AI代码解释
复制
  def create
    @item = current_user.items.create(item_params)

    if @item.save
      render json: @item, status: :created, location: @item
    else
      render json: @item.errors, status: :unprocessable_entity
    end
  end

这样做,会产生一个略微不同的错误:{"list":["must exist"]}

从服务器:

代码语言:javascript
运行
AI代码解释
复制
Started POST "/lists/4/items" for 127.0.0.1 at 2017-08-09 23:09:20 -0400
Processing by ItemsController#create as */*
  Parameters: {"item"=>{"name"=>"Test Item", "quantity"=>"1", "price"=>"9.99", "store"=>"Fruit Center", "category"=>"Dairy", "notes"=>"Important Note"}, "list_id"=>"4"}
  User Load (0.1ms)  SELECT  "users".* FROM "users" WHERE "users"."token" = $1 LIMIT $2  [["token", "27e3e2a67d86cb9d3f46d20651370b74"], ["LIMIT", 1]]
   (0.1ms)  BEGIN
   (0.2ms)  COMMIT
   (0.1ms)  BEGIN
   (0.1ms)  ROLLBACK
[active_model_serializers] Rendered ActiveModel::Serializer::Null with ActiveModel::Errors (0.07ms)
Completed 422 Unprocessable Entity in 32ms (Views: 2.2ms | ActiveRecord: 4.1ms)

看起来list_id确实在参数中传递了,但在create方法中没有被拾取。

我觉得我可能错过了一些简单的东西。有什么想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-10 05:04:51

请注意,在日志中,list_id不在item参数内:

代码语言:javascript
运行
AI代码解释
复制
Parameters: {"item"=>{"name"=>"Test Item", "quantity"=>"1", "price"=>"9.99", "store"=>"Fruit Center", "category"=>"Dairy", "notes"=>"Important Note"}, "list_id"=>"4"}

params[:list_id] # => 4
params[:item][:list_id] # => nil

您在item_params中列出了白名单中的params[:item][:list_id],但list_id并未嵌套在params[:item]中,因为在您的项目表单中,您没有一个字段来传递它(需要一个带有name='item[list_id]'的表单输入)。相反,将根据路由/lists/4/items为请求设置params[:list_id] = 4。你可以做到

代码语言:javascript
运行
AI代码解释
复制
def create
  @item = current_user.items.build(item_params)
  @item.list_id = params[:list_id]

  if @item.save
    render json: @item, status: :created, location: @item
  else
    render json: @item.errors, status: :unprocessable_entity
  end
end

请注意,我调用的是current_user.items.build而不是current_user.items.create。使用current_user.items.create将尝试立即保存记录,在这种情况下您不想这样做(看起来是这样)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45603826

复制
相关文章
Wikipedia pageview数据获取(bigquery)
维基百科pageview数据是Wikimedia技术团队所维护的访问量数据集。该数据集自2015年五月启用,其具体的pageview定义为对某个网页内容的请求,会对爬虫和人类的访问量进行区分,粒度为小时级别,如下图:
千灵域
2022/06/17
3K0
Wikipedia pageview数据获取(bigquery)
如何在 React 中获取点击元素的 ID?
在 React 应用中,我们经常需要根据用户的点击事件来执行相应的操作。在某些情况下,我们需要获取用户点击元素的唯一标识符(ID),以便进行进一步的处理。本文将详细介绍如何在 React 中获取点击元素的 ID,并提供示例代码帮助你理解和应用这个功能。
网络技术联盟站
2023/06/07
7.2K0
获取HTML网页中option标签元素的值
在进行表单元素的操作时,难免会遇到对option元素的挑选,下面的示例代码能够很好的获取到你option元素选择的值,如果要传递给后端,可通过ajax或者其他方式传递即可。 示例代码
呆呆
2021/10/09
9K0
pythonic实践之获取dict中的元素值
但是大部分情况下,在真实的环境中,这个key有可能不存在。 如果使用下标的方法,那么需要捕捉KeyError错误或者先用if判断key是否存在。这样代码写起来非常的ugly。
有福
2018/08/28
3.4K0
如何在 WPF 中获取所有已经显式赋过值的依赖项属性
获取 WPF 的依赖项属性的值时,会依照优先级去各个级别获取。这样,无论你什么时候去获取依赖项属性,都至少是有一个有效值的。有什么方法可以获取哪些属性被显式赋值过呢?如果是 CLR 属性,我们可以自己写判断条件,然而依赖项属性没有自己写判断条件的地方。
walterlv
2023/10/22
2.2K0
js、jQuery 获取文档、窗口、元素的各种值
浏览器当前窗口文档body的宽度: document.body.clientWidth;(仅仅是body的width) 浏览器当前窗口文档body的高度: document.body.clientHeight;(仅仅是body的height)
Krry
2018/09/10
15.9K0
如何在YouTube Api限额的情况下获取更多视频
谷歌限制了YouTube api v3的请求量,一天10000配额,这里不是10000次请求,每次请求根据不同参数消耗不同配额。为了摆脱这种限制而获得更多的新发布视频,做了以下内容的方案。
一滴水的眼泪
2020/09/24
3.2K0
如何在保留原本所有样式/绑定和用户设置值的情况下,设置和还原 WPF 依赖项属性的值
WPF 备份某控件的一些属性,做一些神奇的操作,然后再还原这些属性。多么司空见惯的操作呀!然而怎么备份却是值得研究的问题。直接赋值?那一定是因为你没踩到一些坑。
walterlv
2023/10/22
9120
【DB笔试面试599】在Oracle中,如何在不执行SQL的情况下获取执行计划?
♣ 题目部分 在Oracle中,如何在不执行SQL的情况下获取执行计划? ♣ 答案部分 1、“EXPLAIN PLAN FOR SQL”不实际执行SQL语句,生成的计划未必是真实执行的计划。但是,必
AiDBA宝典
2019/09/29
3.5K0
Spring在无RedirectAttributes的情况下(如Interceptor中)使用Flash scope
判断逻辑很简单,但是重定向的时候需要前台有消息提示,如果是在Controller中,可以在方法上注入RedirectAttributes参数,但是Interceptor中默认没有这个参数,那么我们如何实现RedirectAttributes的flashMessage功能呢?
飞奔去旅行
2019/06/13
7.4K0
Python - 字典中的值求和
Python 编程语言是一种高级的通用编程语言,广泛用于各种目的。该软件由网页设计、数据分析和人工智能组成。人们之所以意识到这一点,是因为它的简单性、易读性和可用性的便利性。Python 提供了各种预定义的数据结构,包括列表、元组、映射、集合、堆和阵容。这些组件在每种编程语言中都至关重要。在这篇文章中,我们将专注于用于保存关键信息对的词典。
很酷的站长
2023/08/11
1.7K0
Python - 字典中的值求和
图片不变形,宽高不超出父元素的情况下旋转图片
如题,具体的效果见这里 。做这样的效果的难点在于,计算没旋转前图片的宽,高和旋转后的宽高。
前端GoGoGo
2018/08/24
2.3K0
WdatePicker 如何在js里获取到选中的值
<input id="executeDateTime" class="txtbox_normal1 form-control Wdate"  onclick="WdatePicker({el:'executeDateTime',dateFmt:'yyyy-MM-dd HH:mm:ss',onpicked:pickedFunc})" tabindex="3" />
爱明依
2019/03/12
13.1K0
DevOps如何在不牺牲安全性的情况下迁移到云端
企业采用DevOps意味着开发进行将比以往任何时候都要快。那么如何确保一切都是安全的,尤其是将业务迁移到云端时? 调研机构Gartner公司预测, 2022年全球云计算服务市场规模和增长率几乎是整体I
CloudBest
2019/09/17
9090
DevOps如何在不牺牲安全性的情况下迁移到云端
JavaScript数组求和_js获取对象数组的第一个元素
您如何找到其元素的总和?好吧,解决方案是一个array.reduce()方法。Array.prototype.reduce()函数可用于遍历数组,将当前元素值添加到先前项目值的总和中。
全栈程序员站长
2022/11/10
7.9K0
删除线性表中所有值为x的数据元素
voide del_x_l(SqlList &L,Elemtype x){ int k=0;//记录值不等于x的元素个数 for(i=0;i<L.length;i++){ if(L.data[i]!=x){ L.data[k]=L.data[i]; k++;//不等于x的元素增1 } } L.length=k; } voide del_x_2(SqlList &L,Elemtype x){
week
2018/08/27
1.7K0
Excel公式技巧68:查找并获取所有匹配的值
在《Excel公式技巧67:按条件将数据分组标识》中,我们根据指定的条件采用数字标识将数据进行了分组。利用这列分组数据,我们能方便地查找并获取所有匹配的值。
fanjy
2020/12/08
11.8K0
Excel公式技巧68:查找并获取所有匹配的值
练习14—元素求和
题目 从键盘输入n (个数不限)个整形数字,放入数组PArray, 调用函数 int *Calc(int *PA,int Num); 计算数组中所有元素的和返回到 main 函数,输出计算结果。 解题步骤 (1)定义数组、变量; (2)接收设定值; (3)分配内存空间; (4)元素求和; (5)输出; C语言 #include <stdio.h> #include <stdlib.h> int *Calc(int *PA, int Num) { int sum = 0, i;
攻城狮杰森
2022/06/03
2260
点击加载更多

相似问题

等待UI更新后再删除UIActivityIndicator

20

等待Swing完成更新JProgressBar后再继续

25

立即显示子视图/等待视图可见后再继续

32

等待内部指令编译后再调用api函数

10

反应16.13: useState等待状态更新后再呈现

12
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档