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: 本文が文字列以外の値を生成しました [: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 (#each に応答)] の 3 つの要素を持つ配列
  • 2 つの要素を持つ配列: [ステータス (Fixnum)、応答本文 (#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 に答える