首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >当模型没有被路由公开时,为模型添加验证有意义吗?

当模型没有被路由公开时,为模型添加验证有意义吗?
EN

Stack Overflow用户
提问于 2019-11-26 13:08:51
回答 2查看 44关注 0票数 0

添加模型级别验证是否有意义,例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Person < ApplicationRecord
  validates :name, presence: true
end

当它是一个未被路由公开的资源时?

我的一个好朋友告诉我,我应该总是为数据库中不能为空的列添加验证。例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class CreatePosts < ActiveRecord::Migration[6.0]
  def change
    create_table :posts do |t|
      t.belongs_to :site, null: false
      t.string :title, null: false

      t.timestamps
    end
  end
end

在这种情况下,我应该有以下验证:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Post < ApplicationRecord
  validates :site_id, presence: true
  validates :title, presence: true
end

现在,只能通过父级创建帖子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Site < ApplicationRecord
  accepts_nested_attributes_for :post
  # ...
end

但当我尝试通过该站点创建帖子时,它将失败,并显示以下信息:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
    "post.site_id": [
        "can't be blank"
    ]
}

我应该还是不应该添加验证?为不能通过路由直接接触的模型添加验证似乎有点奇怪。

谢谢。

EN

回答 2

Stack Overflow用户

发布于 2019-11-26 13:28:08

当模型没有被路由公开时,为模型添加验证有意义吗?

是。

并不是Rails应用程序中的每个模型实际上都对应于一个路由和它自己的控制器。模型可以表示的不仅仅是RESTful资源(尽管99%的时间都在使用它们。

此外,没有路由并不意味着模型不处理用户输入。当您使用嵌套属性时,您仍然需要从用户获取输入。

但这在这里并不是很重要。

通常,在定义嵌套资源时,您可以这样做:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
resources :sites do
  resources :posts
end

class PostsController < ApplicationController
  before :action_set_site

  # POST /sites/1/posts
  def create
    @post = @site.posts.new(post_params)
    # ...
  end

  private
  def set_site
    @site = Site.find(params[:site_id])
  end
end

在这种情况下,是否在Post上进行验证并不重要,因为如果参数不存在或与记录不对应,Site.find(params[:site_id])将引发ActiveRecord::RecordNotFound错误。Rails捕捉到这个异常并返回一个404 - Not Found响应,这是本例中的正确响应。如果客户端尝试在不存在的终结点上创建资源,则不应返回422 - Bad Entity

您似乎完全误解了嵌套属性的用途。如果您必须将多个资源的创建/更新合并到一个表单/请求中,那么accepts_nested_attributes_for是一种非常有用的技巧。在这种情况下,如果你想让用户同时创建一个帖子和站点。在这种情况下,验证也是无关紧要的,因为设计上的嵌套属性会将帖子嵌套在站点中。

不应该仅仅因为一个资源只能存在于另一个资源的上下文中而使用它。这就是嵌套路由的用途。

票数 0
EN

Stack Overflow用户

发布于 2019-11-26 13:22:20

使用嵌套属性时,保存站点+帖子时site_id有时是未知的。您必须告诉rails这些关联是相关的,如下所示

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Site 
  has_many :posts

class Post 
  belongs_to :site, inverse_of: :posts 

请注意,从Rails5开始,添加belongs_to本身就会添加验证。可以通过以下方式来推翻这一点:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  belongs_to :site, optional: true 

当使用嵌套属性时,您必须删除validates :site_id, presence: true验证,因为在检查验证时site_id是未知的。在保存site + post之前(因此,在分配id之前)检查验证(在rails级别)。

数据库约束绝对是有价值的imho。特别需要/建议在rails级别添加验证,以便在输入表单时(换句话说,如果它们是用用户生成的数据创建/编辑的),以一种更用户友好的方式捕获错误。因此,哪条路由公开它们并不重要,重要的是是否有一个包含表单的页面来创建/编辑它们。

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

https://stackoverflow.com/questions/59051698

复制
相关文章
Hinton取得新进展,以更少数据识别图像
谷歌人工智能先驱Geoffrey Hinton公布了AI技术进展,可提高电脑正确识别图像的速度和较少的数据依赖。 Google公司公布了关于其人工智能先驱Geoffrey Hinton技术的进展。该技术提高了计算机识别图像的速度,且只需要较少的数据。Hinton是一位科研人员,他在人工神经网络方面的工作被看成机器学习商业化的基础。上个星期他在学术网站上匿名发表了两篇研究论文,详细介绍了这种被称为胶囊网络的方法。这种方法可能意味着电脑会能够识别与图像库中的已知图像有不同拍摄角度的照片。它也可以被应用于语音和视
人工智能快报
2018/03/15
5750
中科院化学所刘冰JACS:高分子胶体可控合成研究取得进展
盘状胶体作为典型的各向异性胶体之一,是自组装构建复杂层级结构的理想单元,也是研究自组装、玻璃化转变、扩散、颗粒流变学、介晶相行为中许多基本物理化学问题的有效模型。目前,合成单分散、形状可控、表面化学清晰的高分子盘状胶体仍缺少普适性方法。
JoJo_Beatles
2021/03/11
7400
中科院化学所刘冰JACS:高分子胶体可控合成研究取得进展
以写代学:python 错误、异常、断言
     语法错误指示软件的结构上有错误,导致不能被解释器解释或编译器无法编译。这些错误必须在程序执行前纠正。
py3study
2020/01/15
7200
pycharm安装库老是失败_申报状态已申报未导入
在pycharm中每一个project都可以有一个属于自己的库,在创建新project的时候会给到一个新的库,这个时候的话就有可能会出现安装过的库报错,还需要重新安装的问题。 如果不是创建一个大工程的话可以把这个工程的库的路径指向默认的文件夹,然后在默认的文件夹中安装常用的库,然后小脚本之类的就指向这个文件夹,这样子就不用下次重新安装库了。
全栈程序员站长
2022/09/27
6150
pycharm安装库老是失败_申报状态已申报未导入
业绩超预期因子
学术界很早就发现,股票市场存在显著的盈余公告后的价格偏移现象(Post-Earnings Announcement Drift PEAD)。通俗解释来说,投资者对于公司的盈利有一个预期值,如果财报公布后,公司的实际盈利超出了投资者预期,公司的股价会上升,会有明显的超额收益。如果实际盈利低于投资者预期,公司股价会下降,会有明显的负向收益。本文基于这一现象构造盈利超预期因子,并对因子进行测试。后台回复“业绩超预期”获取代码和参考文献,限时免费。
量化小白
2020/03/18
2.9K0
业绩超预期因子
企业家的优势:.icu如何推动小型企业以取得在线的成功
在当今的数字时代,建立强大的在线形象对于小型企业的蓬勃发展来说是至关重要的。随着竞争的加剧和消费者行为的不断变化,企业家需要一种强大的工具来使他们脱颖而出。这就是 .icu 域扩展发挥作用的地方。在本文中,我们将探讨 .icu 如何赋能企业家并推动小型企业在线取得成功。
腾讯云DNSPod团队
2023/07/24
3910
企业家的优势:.icu如何推动小型企业以取得在线的成功
高企申报很简单,高企云自助申报高企专题
6月到8月是申报高企认定的时间,很多企业都不知道怎么申报高企认定,为此,高企云小编专门制作了一个有关高企认定的专题,想自己申报高企认定的可以看看。下面是高企认定专题的主要内容简介,有兴趣的可以去看看。
高新企业认定网
2018/06/11
7770
高企申报很简单,高企云自助申报高企专题
以时间为尺,丈量AI价值 -「AI中国」机器之心2022年度奖项申报正式启动
在过去的十几年中,我们看到人工智能技术的突破层出不穷,产业应用遍地开花;我们同样也经历了疫情冲击,遭受了技术封锁,目睹了一批创业公司的倒下。 人工智能的发展并非一帆风顺,但研究者、从业者、创业者们仍在披荆斩棘,未曾停下脚步。时光不负有心人,近年来严酷的考验无法打败真正优秀的、理性的人工智能企业;而人工智能对技术和产业的价值也将在磨砺下风云会合,展现光辉。 伴随人工智能技术发展,国家及地方政策推动,智能汽车渗透率正在快速提升。更多科技企业、互联网公司的加入,则不断为智能汽车产业带来新的思想和理念。而各行各业
机器之心
2022/08/31
3120
以时间为尺,丈量AI价值 -「AI中国」机器之心2022年度奖项申报正式启动
华盛顿大学 | 模型优化新方法!以任务向量为中心,编辑模型生成预期效果(含源码)
 在开发机器学习系统时,提高模型在下游任务上的表现或减少在预训练中学习到的偏见,一种常见的方法是对预训练模型做人为干预引导。为此,本文提出了一种以任务向量为中心来引导神经网络产生预期结果的新范式。
ShuYini
2023/03/06
4860
华盛顿大学 | 模型优化新方法!以任务向量为中心,编辑模型生成预期效果(含源码)
怎样取得文件行数
perl -ne 'END {print "$i"} ++$i' filename
一见
2018/08/07
1.4K0
Python高分书籍推荐
网上有很多书籍,但是有的太过老旧,使用的是已经弃用的Python2版本;有的写得太过繁琐,缺少实用性。我从高分图书中筛选了下面这些优秀的Python书籍,推荐给大家。
一只大鸽子
2022/12/06
1.2K0
Python高分书籍推荐
识别最优的数据驱动特征选择方法以提高分类任务的可重复性
在机器学习研究中,特征选择是十分重要的一个环节。很多脑影像机器学习研究者更多追求的是所选特征的预测精度,而本文的作者更关注所选特征的可重复性。作者提出的基于图论的FS-Select算法,在挑选出具有可重复性特征的同时,兼顾了其预测准确性。该研究由土耳其伊斯坦布尔科技大学的Nicolas Georges 等人发表在最近的Pattern Recognition杂志上。
用户1279583
2020/02/25
1.1K0
技术专利申报经验分享
最近的重点工作是专利申报,借这里和大家分享一下心得。 >>什么是专利: >>如何查询专利: >>如何申请专利: >>案例分析:
物流IT圈
2019/07/16
4380
技术专利申报经验分享
美光警告:裁员人数将高于预期,本季毛利率可能低于预期!
3月4日消息,据多家外媒报道,存储芯片大厂美光(Micron)警告称,受到产业供给过剩影响,公司裁员人数恐怕会比先前披露的还多,第三季(3-5 月)毛利率也很可能逊于高层原本预期。
芯智讯
2023/03/24
2230
美光警告:裁员人数将高于预期,本季毛利率可能低于预期!
ORDER BY导致未按预期使用索引
在MySQL中经常出现未按照理想情况使用索引的情况,今天记录一种Order by语句的使用导致未按预期使用索引的情况。
俊才
2019/11/28
2.7K0
node_modules / rxjs / internal / types.d.ts中的错误(81,44):错误TS1005:';' 预期。 node_modules / rxjs / int...
ng new ngx-doc 关于使用ng创建出的新项目报如下错: ERROR in node_modules/rxjs/internal/types.d.ts(81,44): error TS1005: ';' expected. node_modules/rxjs/internal/types.d.ts(81,74): error TS1005: ';' expected. node_modules/rxjs/internal/types.d.ts(81,77): error TS1109: Expre
用户1437675
2019/03/06
3.8K0
高分通过!TCE高分通过密码应用安全性评估(3级)
仅90余天,借助腾讯安全云鼎实验室的商用密码合规解决方案,腾讯专有云企业版Tencent Cloud Enterprise(Tencent TCE)于2021年11月高分通过第三方密评机构的密码应用安全性评估(3级标准)。
腾讯安全
2022/01/18
2.2K0
高分通过!TCE高分通过密码应用安全性评估(3级)
高分通过,再创佳绩
腾讯重庆云计算数据中心 2021年Q4 近日,重庆腾讯云计算数据中心顺利通过全球数据中心标准认证机构Uptime Institute的 M&O运维认证,成为腾讯继天津滨海数据中心后第二个获此认证的自建数据中心。 重庆腾讯云计算数据中心位于重庆市两江水土国际数据港,是腾讯在国内的第二个大型自建数据中心。重庆腾讯云计算数据中心一期于2018年建成并启动运营,陆续为百余家国内外知名企业提供了云服务。2020年,重庆腾讯云计算数据中心正式启动二期建设,整体建成后将具备20万台服务器的运算存储能力,关联
腾讯数据中心
2021/12/16
5580
高分系列卫星详细介绍
高分专项启动实施8年来,高分卫星数据已替代进口,自给率达80%,突破了长期依赖国外数据的局面,本期详细介绍下高分系列卫星。
疯狂学习GIS
2023/07/09
7.3K0
高分系列卫星详细介绍
Serverless比你预期要贵得多
作者 | COLIN CHARTIER 译者 | 张健欣 策划 | 万佳 在运营一个持续集成(CI)公司多年后,你会发现架构决策中的许多隐藏成本。在本文,我想谈谈 Serverless 和它的主要替代方案——微服务(容器化)架构,它们之间的实际区别。 1架构介绍:Serverless 和容器 +CDN 我们在过去几年看到的新产品中的绝大多数后端架构都属于这两者之一。  Serverless Serverless核心思想是指定一个策略来创建新的 Web 服务器,而不是自己启动它们。这样一来,如果你的产品在某个
深度学习与Python
2023/04/01
5570
Serverless比你预期要贵得多

相似问题

如何快速解决预期的申报错误?

11

团结-我怎样才能取得高分?

22

如何用雪碧套件和迅捷在比赛中取得高分

10

骰子申报错误

31

错误地使用远期申报?

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文