【问题标题】:Ruby on Rails: How to validate if on specific page?Ruby on Rails:如何验证是否在特定页面上?
【发布时间】:2017-01-25 16:40:07
【问题描述】:

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

validates :port, presence: true

这成功确保用户输入他们的端口号,但是当用户通过views/users/_new.html.erb 页面注册时,他们只需输入一个电子邮件地址(例如 example@example.com),然后users_controller 将创建一个在Account 表中记录此电子邮件地址。我的问题是在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 %> 但我需要添加进一步的验证以及存在,所以这不合适。

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 validation ruby-on-rails-4


    【解决方案1】:

    您可以创建一个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
        ...
    

    【讨论】:

      【解决方案2】:

      将该部分逻辑提取到表单对象中,查看legendary 2012 blog entry from CodeClimate。从那以后情况发生了变化,作者使用Virtus 来构建表单对象,这些天更流行和最新的 gem 是:

      如果这是一次性的事情,那就做what Steve said in the other answer 但这肯定是通向地狱、安全仇恨和离婚(至少从个人经验来看)在任何稍微小点更大的事情项目(即你的意思是多花几个小时在上面工作,并不是说你刚刚完成所有事情就想回家)。

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

      由于模型回调,我自己最喜欢的个人搞砸是发送 240.000 封“您的帐户已升级/降级”电子邮件,因为 account_type 属性迁移中的无害拼写更改更新只是因为 account_type_changed? 是真的。

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

      【讨论】:

        【解决方案3】:

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

        Ruby on Rail MVC 开始,ViewModel 都与控制器通信,另一种解决方案是让控制器在传递值以创建 account 之前处理参数的验证

        【讨论】:

          猜你喜欢
          • 2014-06-18
          • 1970-01-01
          • 1970-01-01
          • 2023-03-31
          • 2012-04-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-10-15
          相关资源
          最近更新 更多