Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails RubyonRails:如何验证是否在特定页面上?_Ruby On Rails_Ruby_Ruby On Rails 3_Validation_Ruby On Rails 4 - Fatal编程技术网

Ruby on rails RubyonRails:如何验证是否在特定页面上?

Ruby on rails RubyonRails:如何验证是否在特定页面上?,ruby-on-rails,ruby,ruby-on-rails-3,validation,ruby-on-rails-4,Ruby On Rails,Ruby,Ruby On Rails 3,Validation,Ruby On Rails 4,在我的RubyonRails应用程序中,我尝试添加验证,以确保用户在文本框中输入值。在我的系统中,我有一个名为Account的表,当用户进入views/accounts/_form.html.erb页面添加一个新的电子邮件帐户时,该表存储用户的电子邮件帐户信息,我想验证是否存在端口号。我可以通过以下代码执行此操作: validates :port, presence: true 这成功地确保了用户输入他们的端口号,但是当用户通过views/users/_new.html.erb页面注册时,他们

在我的RubyonRails应用程序中,我尝试添加验证,以确保用户在文本框中输入值。在我的系统中,我有一个名为
Account
的表,当用户进入
views/accounts/_form.html.erb
页面添加一个新的电子邮件帐户时,该表存储用户的电子邮件帐户信息,我想验证是否存在端口号。我可以通过以下代码执行此操作:

validates :port, presence: true
这成功地确保了用户输入他们的端口号,但是当用户通过
views/users/_new.html.erb
页面注册时,他们只需输入电子邮件地址(例如example@example.com)然后,
users\u controller
将在
Account
表中为此电子邮件地址创建一条记录。我的问题是在
views/accounts/_form.html.erb
页面上需要端口号,但在
views/users/_new.html.erb
页面上不需要

如果用户在
views/accounts/_form.html.erb
页面或调用
accounts\u controller
中的
create
方法,是否有方法验证用户是否输入了端口号


我知道我可以通过HTML所需的验证这样做:
true%>
,但我需要添加进一步的验证以及显示,因此这并不合适。

您可以创建一个
attr\u accessor
字段来确定是否应该进行验证

class Account < ActiveRecord:Base
  attr_accessor :port_needs_validation
  validates :port, presence: true, if: -> {port_needs_validation} 

将该部分逻辑提取到form对象中,检查。从那时起,情况发生了变化,作者使用
Virtus
构建表单对象,现在更流行和最新的gems是:

如果这是一次性的事情,那就去做吧,但这是一条通往地狱的必经之路,在任何一个稍小的更大的项目中(即,你的意思是要花更多的时间在这件事上,这并不是说你刚刚完成了所有的事情,想回家)

实际上,只要在任何地方使用表单类,就可以避免模型验证和其他回调。在编写测试时,您不希望发送帐户激活邮件或验证您的密码复杂性,只需要一个属于“用户”的“帖子”

由于模型回调,我自己最喜欢的个人问题是发送240.000封“您的帐户已升级/降级”电子邮件,因为
帐户类型
属性迁移中的拼写更改更新仅仅是因为
帐户类型发生了更改?
是真的


所以。。表单类永远不会出现,模型回调永远不会出现。

我不建议您使用
模型
了解
视图
。在@SteveTurczyn的解决方案中,在模型中引入了一个抽象字段来标识它来自哪个页面,这是一个很好的解决方案

从开始,
视图
模型
都与控制器对话,另一个解决方案是在传递值以创建
帐户
之前,让控制器处理参数验证

def create
  @account = Account.new
  @account.assign_attributes(account_params)
  @account.port_needs_validation = true
  if @account.save
    ...