3

Rails dev 是 sinatra 的新手……我正在尝试做一些简单的验证。当我尝试:

validates_presence_of :email, message: "Email cannot be blank."

   @emails.errors.each do |e|
      puts e
    end 

辛纳屈回归

[:errorI"^Rack::Lint::LintError: Body 产生非字符串值 [:email, ["Email 不能为空。"]

如何从该数组中提取错误消息,以及我应用于此表的任何进一步验证。

我已经尝试过puts e.first和其他一些选择,但我无处可去。我应该这样做吗?

提前致谢!

# app.rb
require "sinatra"
require "Clipboard"
require "sinatra/activerecord"
require 'pony'

#basic auth
use Rack::Auth::Basic, "Enter Demo password." do |username, password|
  [username, password] == ['censor', 'censor']
end


#options
set :port, 3000

# configure :development do
  set :database, "sqlite3:///exceptDev.db"
# end

#end options


######################
####    MODELS      #
######################

class Emails < ActiveRecord::Base
  #validate fields  
  validates_presence_of :email, message: "Email cannot be blank."
end



######################
####    ROUTES       #
######################

get '/' do
  erb :index
end


get '/contact' do
  #create email record
  @fullname = params[:name].split
  @emails = Emails.create(first_name: @fullname.first, 
                          email: params[:email], 
                          last_name: @fullname.last,
                          msg: params[:msg],
                          postcards: params[:postcards],
                          stickers: params[:stickers]
                          )

  if @emails.save 
    redirect "/", notice: "HYFR!"
  else
    redirect "", errors: "wsdfasdf"
    # @emails.errors.each do |e|
    #   puts e
    # end #errors block
  end #if save
end #contact action
4

1 回答 1

3

文档中

路由块的返回值至少决定了传递给 HTTP 客户端的响应主体,或者至少决定了 Rack 堆栈中的下一个中间件。最常见的是,这是一个字符串

您正在尝试传递数组而不是字符串。返回类型是(再次,在文档中列出)

  • 一个包含三个元素的数组:[status (Fixnum), headers (Hash), response body (responds to #each)]
  • 一个包含两个元素的数组:[status (Fixnum), response body (responds to #each)]
  • 响应 #each 并且只将字符串传递给给定块的对象
  • 表示状态代码的 Fixnum

如果您发布了您编写的代码,那么向您展示要做什么会更容易,但这基本上就是正在发生的事情。


从附加代码:

在路线的最后,尝试这样的事情:

get '/contact' do
  # other code, then…

如果@emails.errors

  unless @emails.errors?
    haml :show_a_nice_view_to_the_user
  else
    output = @emails.errors.join("; ")
    # log problems…

停止 500,输出

    haml :error_template
  end
end

# in the error_template (or the show_a_nice_view_to_the_user
# it's up to you if you show a special page or not)
- @errors.full_messages.each do |error|
  %p= error
于 2013-04-14T01:34:42.030 回答