【问题标题】:Validating with ActiveModel in Ruby on Rails 4 Seemingly not Working在 Ruby on Rails 4 中使用 ActiveModel 进行验证似乎不起作用
【发布时间】:2016-07-06 03:09:15
【问题描述】:

当我将数据输入到我知道应该失败的表单中时,它不会。根据我下面的模型,我要求数据是 a-z、A-Z、0-9 和空格的任意组合,并且当我在表单中填充垃圾时,例如 )(&^%^&(* &%^&** 甚至提交一个空字段,我预计会有错误。在这种情况下,没有。

这是模型的重点:

class Numerology
  include ActiveModel::Model

  attr_accessor  :phrase

  VALID_PHRASE_REGEX = /\A[a-zA-Z0-9\s]+\z/

  validates :phrase, presence: true, length: { minimum: 1 },
            format: { with: VALID_PHRASE_REGEX }

这是控制器...我想要它做的是返回索引(上面有表单的页面),当我在表单上提供错误输入时会生成任何错误。不确定我是否在这里以正确的方式进行,但我认为这可能是次要问题,因为我似乎根本没有产生任何错误(所以当然 @numerology.errors.any? 会是错误的) .

class NumerologiesController < ApplicationController
  before_filter :authenticate_user!
  respond_to :html

  def index
    @numerology = Numerology.new
  end

  def create
    @numerology = Numerology.new(params[:numerology])
    if @numerology.errors.any?
      render :index
    else
      @numresults = Numerology.analysis(params[:numerology][:phrase])
    end
  end

end

最后,这里是视图,首先是索引,然后是创建:

索引页面:

<div class="center jumbotron">
  <h1>Numerology Analysis Module</h1>

  <br>
  <%= bootstrap_form_for(@numerology, layout: :horizontal, label_col: "col-sm-4", control_col: "col-sm-6") do |f| %>

    <p> Enter word or phrase to be analyzed in the field below (Required).</p>

    <%= @numerology.errors.full_messages.each do |message| %>
      <li><%= message %></li>
    <% end %>
    <%= f.text_field :phrase, label: "Word or Phrase: " %>

    <br><br>

    <%= f.submit "Perform Numerological Analysis" %>
  <% end %>
  <br><br>
  <%= image_tag("SMILE.jpg", alt: "Smiley Face") %>
</div>

创建页面:

<div class="center jumbotron">
  <h1>Numerological Analysis Report</h1>
  <div class="numreport">
    <table class="numtable">
      <% @numresults.each do |line| %>
        <% if !line.nil? %>
          <tr>
            <td><%= "#{line}" %></td>
          </tr>
        <% end %>
      <% end -%>
    </table>
  </div>
  <%= link_to "Perform Another Numerological Analysis - Click Here",   numerologies_path %>
  <br><br><br>
  <%= image_tag("SMILE.jpg", alt: "Smiley Face") %>
</div>

那么,有没有人看到我在这里做错了什么?建议尝试其他事情?谢谢!

【问题讨论】:

  • 没有什么比这更明显了。我建议尝试这个:1)运行rails console 2)n = Numerology.new(:phrase =&gt; ")(&amp;^%^&amp;(*&amp;%^&amp;**") 3)n.valid? 4)puts n.errors.inspect 5)复制输出并编辑您的问题并输入它...(除非错误对您来说很明显)这样做)。 (注意:rails 控制台中的周转速度更快......另外,您可以区分验证是否实际工作 vs 控制器返回错误的方式有问题)
  • 原来解决方案是我没有调用有效?或无效?任何地方,一旦我做到了,一切就开始工作了。感谢您的回复并指出控制台的使用 - 我会牢记这一点。

标签: ruby-on-rails ruby activemodel validating


【解决方案1】:

您需要调用valid?invalid? 来填充错误列表。

http://api.rubyonrails.org/classes/ActiveModel/Validations.html#method-i-valid-3F

有效吗?(context = nil)

运行所有指定的验证,如果没有错误则返回 true 否则添加 false。

  def create
    @numerology = Numerology.new(params[:numerology])
    if @numerology.invalid?
      render :index
    else
      @numresults = Numerology.analysis(params[:numerology][:phrase])
    end
  end

【讨论】:

  • 成功!在这种情况下,调用无效?是灵丹妙药。感谢您提供文档页面的链接。有趣的是,我在所有阅读和谷歌搜索中都阅读了该页面,但由于某种原因,它并没有在我的脑海中“点击”它告诉我的内容(而现在回想起来很明显)。感谢您的帮助!
  • 太棒了,你找到了解决方案。我没有发现您只有new 而不是create/update,它们是常见的(创建/更新也将调用valid?)。我确实认为我应该说:使用正数而不是负数通常是一个很好的红宝石练习,因为人脑更难找出负数。所以在这种情况下,我会说 if @numerology.valid? (do_positives_stuff) else render :index 而不是你现在拥有它的方式......否则,伟大的工作:)
猜你喜欢
  • 1970-01-01
  • 2013-12-07
  • 1970-01-01
  • 2015-03-12
  • 2011-06-21
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
  • 2018-07-30
相关资源
最近更新 更多