railsではDBが存在しているバリデーションは簡単に実装出来ますが、そうでない場合は自分で検証処理をしなければならないと思っていました。いろいろ調べていくとactiverecordを継承しないmodelを作ると通常の検証処理を使える事がわかりました。
対応方法を以下に示します。参考にしたサイト
booksの中にsearchを追加する設定です。
routes.rb (search:検索画面表示用 create_search: 検索結果の判断 list:検索結果の表示)
対応方法を以下に示します。参考にしたサイト
get "books/list" get "books/search" post "books/create_search" resources :booksbooks_contoller.rb
class BooksController < ApplicationController .... #検索画面用 def search @search = Search.new @search.title = "ruby" #デフォルト値のセット end #バリデーション def create_search @search = Search.new(params[:search]) flash[:params] = params[:search] #バリデーション if @search.valid? redirect_to :action => :list else render :action => :search end end #結果の表示 def list params = flash[:params] @list = Book.find_all_by_title params[:title] end endsearch.erb
<%= form_for(@search,:url=>{:action => :create_search}) do |f| %> <% if @search.errors.any? %>application_helper.rb<% end %><%= pluralize(@search.errors.count, "") %> エラーが発生しています
<% @search.errors.full_messages.each do |msg| %>
- <%= only_error_message msg %>
<% end %><%= f.label :title,"タイトル" %>
<%= f.text_field :title %><%= f.submit %><% end %>
def only_error_message str arr = str.split(" ") arr.last endsearch.rb
# coding: utf-8 #activerecordを継承していないモデル class Search include ActiveModel::Validations include ActiveModel::Conversion extend ActiveModel::Naming attr_accessor :title #メッセージ半角スペースを入れて、メッセージ表示時にonly_error_message関数を使って、フィード名を削除 validates_length_of :title, :maximum => 10 ,:message => " タイトルの最大文字数は10です" def initialize(attributes = {}) attributes.each do |name, value| send("#{name}=", value) end end def persisted? false end end