如何在RoR中验证用户输入?

时间:2010-01-21 19:21:02

标签: ruby-on-rails validation

我真的不知道验证用户输入的建议。我正在开始与RoR。我读了很多关于这个问题的网页,但我从来没有得到过,我想要的是什么。在RoR之前,我用Java编程。我的问题是:如何验证空字段并显示错误消息?这是代码片段:

polls_controller.rb

class PollsController < ApplicationController

 def create

  @poll = Polls.new
  @poll.question = params[:question]
  @poll.author_ip = request.remote_ip

 end

 def show
 end

 def new
 end

 def edit
 end

end

polls.rb

class Polls < ActiveRecord::Base
  has_many :options
  validates_presence_of :question, :message => 'Something is wrong...'
end

create.html.erb

<p>
 <% form_tag polls_path do %>

  <%= label_tag :question, "Enter your question:" %><br>
  <%=text_field_tag :question, params[:question] %>
  <%=submit_tag "Send"  %>

 <% end %>
</p>

3 个答案:

答案 0 :(得分:8)

首先,不要向验证添加无意义的消息,默认的错误消息是好的。

其次,在控制器中将代码更改为类似的内容:

def new
  @pool = Pool.new
end
def create
  @pool = Pool.new(params[:pool])
  if @pool.save
    flash[:notice] = "Some text indicating it was created"
    redirect_to pool_path(@pool)
  else
    flash[:error] = "Something is wrong while validating"
    render :new
  end
end

并查看use form helper

<% form_for @pool do |f| %>
  <%= f.error_messages %>
  <%= f.label :question, "Enter your question:" %><br>
  <%= f.text_field :question %><br>
  <%= submit_tag "Send" $>
<% end %>

这样您就可以在模式下进行验证,而在控制器中,您只需要检查是否可以保存模型。它不会,然后在您的视图中可以显示error_messages for that model

用于在布局位置显示flash messages

<% if flash[:notice] -%>
  <p class="notice"><%= flash[:notice] %></p>
<% end -%>
<% if flash[:error] -%>
  <p class="error"><%= flash[:error] %></p>
<% end -%>

答案 1 :(得分:1)

我会查看this帖子,一件事。 ActiveForm在这里可以提供很多帮助。 但是,如果你想自己滚动它,你可以很容易地在控制器中添加一些验证,就像这里的海报在他更新的代码版本中所做的那样。

def results
if params[:name] && !params[:name].blank?
 @name = params[:name]
else
 raise MyApp::MissingFieldError
end

if params[:age] && !params[:age].blank? && params[:age].numeric?
  @age = params[:age].to_i
else
  raise MyApp::MissingFieldError
end
rescue MyApp::MissingFieldError => err
 flash[:error] = "Invalid form submission: #{err.clean_message}"
 redirect_to :action => 'index'
end

然后你只需要在你的.erb中显示flash [:errors]。

我还要看一下像this这样的东西。

答案 2 :(得分:0)

包含

<% if flash[:notice] %>
    <%= flash[:notice] %>
<% end %>

在您的网页中的某个位置,但最好是app/views/layouts/application.html.erb

有关详细信息,请参阅RoR教程。