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

Ruby on Rails: How to validate if on specific page?

在我的 Ruby on Rails 应用程序中,我尝试添加验证以确保用户已在文本框中输入值。在我的系统中,我有一个名为 Account 的 table,它存储用户的电子邮件帐户信息,当他们进入 views/accounts/_form.html.erb 页面添加新电子邮件帐户时,我想验证是否存在端口号。我可以通过以下代码做到这一点:

validates :port, presence: true

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

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

我知道我可以像这样通过 HTML 所需的验证来做到这一点:<%= f.text_field :port, :required => true %> 但我需要添加进一步的验证以及存在,所以这不是 suitable.

您可以创建一个 attr_accessor 字段来确定是否应该进行验证...

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

然后只需在创建方法中设置访问器...

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

将那部分逻辑提取到表单对象中,查看 legendary 2012 blog entry from CodeClimate。从那以后事情发生了变化,作者使用 Virtus 构建表单对象,这些天更流行和 up-to-date gems 是:

如果这是 one-off 的事情,那就去做 但这肯定会导致地狱,safe-hate 和离婚(至少从个人经验来看) 稍微小一点 更大的项目(即你打算多花几个小时在上面,这不像你刚刚完成所有事情就想回家)。

实际上,只需在所有地方使用表单 类 并完全避免模型验证和其他回调。您不希望在编写测试时发送帐户激活邮件或验证密码的复杂性,而只需要属于 "user".

的 "post"

由于 account_type 属性迁移中无辜的拼写更改更新,由于模型回调,我自己最喜欢的个人错误是发送了 240.000 封 "your account has been upgraded/downgraded" 电子邮件,仅仅因为 account_type_changed? 是真的。

所以.. 永远形成 类,模型回调永远不会。

我不建议您 model 知道 views。 @SteveTurczyn 的方案,在model中引入一个抽象字段来标识它来自哪个页面,这是一个很好的方案。

Ruby on Rail MVC 开始,ViewModel 都与控制器通信,另一个解决方案是让控制器句柄 validation 参数在传递值之前创建 account.