2012年8月26日日曜日

rails 3 検索でのバリデーション

railsではDBが存在しているバリデーションは簡単に実装出来ますが、そうでない場合は自分で検証処理をしなければならないと思っていました。いろいろ調べていくとactiverecordを継承しないmodelを作ると通常の検証処理を使える事がわかりました。
対応方法を以下に示します。参考にしたサイト


booksの中にsearchを追加する設定です。 routes.rb (search:検索画面表示用 create_search: 検索結果の判断 list:検索結果の表示)
  get "books/list"
  get "books/search"
  post "books/create_search"
  resources :books
books_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
end
search.erb
<%= form_for(@search,:url=>{:action => :create_search}) do |f| %>
  <% if @search.errors.any? %>
    

<%= pluralize(@search.errors.count, "") %> エラーが発生しています

    <% @search.errors.full_messages.each do |msg| %>
  • <%= only_error_message msg %>
  • <% end %>
<% end %>
<%= f.label :title,"タイトル" %>
<%= f.text_field :title %>
<%= f.submit %>
<% end %>
application_helper.rb
  
def only_error_message str
    arr = str.split(" ")
    arr.last
  end
search.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

ruby プログラミング

railsはwebアプリを短時間で簡単に作成出来るので、使い方はある程度知っていたのですが、rubyに関してはそんなに関心はなく。あまり理解はしていませんでした。
以前にrubyメタプログラミングの本を読んだときもこんな使い方もあるが、殆ど使わないかなとの感想でした。最近rubyの言語本を読み返すと、rubyってメタプログラミングを使わなくても凄いと感じました。コード量が少ない。(行き過ぎるとわかりにくいコードにはなりますが。。)


ruby言語の感動はつたわらないと思いますが、いくつかサンプルをあげておきます。


イテレータを使ったsql文に条件追加(このイテレータの使い方はいまいち?やはりイテレータ側ではもっと複雑な処理をするものが適しているか?ruby関数のFile.openとかはいい見本かもしれません)
def sql
      "select name,phone,address,age from persons #{yield :where} #{yield :group} #{yield :order}; "
end
only_mphone = true
age =10
strSQL = sql{|type|
    case type
      when :where
        "where age > #{age} #{"and substr(phone,1,3) = '090'" if only_mphone}"
      when :order
        "order by name"
    end
}
puts strSQL

#結果 "select name,phone,address,age from persons where age > 10 and substr(phone,1,3) = '090'  order by name;"
以前に発見した代入方法です。これはわかりやすい。
only_mphone = true
age =10
only_mphone = true
sqlcondition ={:where => "where age > #{age} 
        #{"and substr(phone,1,3) = '090'" if only_mphone}",
              :order => "order by name"}
strSQL = "select name,phone,address,age from persons #{sqlcondition[:where]}  #{sqlcondition[:order]};"
puts strSQL

#結果 "select name,phone,address,age from persons where age > 10 and substr(phone,1,3) = '090'  order by name;"
splitで配列に分解して、joinで接続
puts "2012/8/26".split('/').join('-')

#結果 "2012-8-26"
mapで配列の中身を変更しています。これもいい。
puts "2012/8/26".split('/').map{|x| 
   if x.size == 1 then 
     "0" + 
   x else x end}.join('-')

#結果 "2012-08-26"

富貴➡高野山ルート 

富貴経由高野山に行ってきました。途中に天狗木峠ってあるんですけど、激坂区間は1.5kmほどですが、平均斜度は13パーセントオーバーです。キツかった。
大台ケ原ヒルクラムまで2週間。体重を落とさないと。




昼は高野山でトンカツ定食を食べました。店の名前は"とんかつ定" 微妙な名前です。しかし、わかりやすい。ここのブログを参考に行ってきました。
食べたのはもちろん トンカツ定食です。これがまた量が多い。また、美味しい。

帰る途中で自転車ツーリングの人と話をすると、高野山なら上野屋のオムライスも大きくて美味しいとの情報を頂きました。今度行ってみよう。

2012年8月19日日曜日

海南高原TT

久しぶりに海南高原TTに行ってきました。
結果はまったくでした。1回目33分  2回目37分
この調子だと大台ケ原は2時間オーバーか???

ruby新機能発見

もともとあった機能ですが、知らなくて使っていませんでした。かなり便利。
文字列の中に簡単にrubyのコードを追加する事が出来ます。
a = 10
b = 20
"#{a} + #{b} = #{ a+b}"  => "10 + 20 = 30"

2012年8月15日水曜日

大台ケ原ヒルクラム 1時間50分切れるか?

今日は高野山に二回登ったのですが、一回目は1時間16分。二回目1時間17分。(今日は一日中フリーだったので、二本登りました。もう少し家を出るのがはやければ、三本は行けた。残念)

このタイムを元に大台ケ原ヒルクラムのタイムを予測してみました。
二年前に高野山に登ったときのタイムは1時間20分
スピード的には二年前と比べて5パーセントアップ。
今回はリアスプロケットの最大を25から27に変更。その為のスピードアップは5パーセントと予測。合計で10パーセントのスピードアップしてると予想出来ます。

二年前の大台ケ原ヒルクライムは1時間56分

今回は10パーセント速くなっていると考えると1時間44分(スプロッケットの効果が少なくても1時間50分は切れるかも???

決戦日は9月9日。がんばります。(大台ケ原ヒルクラム


今日の結果:

メッツコーラを高野山のコンビニで飲みました。いまいち。

23度。いつもこんなものですね。

さすがにガリガリ君を食べ過ぎたので。。

2012年8月14日火曜日

マルちゃん製麺

最近やっとマルちゃん製麺を食べてみました。
感想は”うまい”の一言です。

2012年8月13日月曜日

自転車3台洗いました

通勤車二台と決戦車一台を洗いました。
三万円の自転車(緑の自転車)は駄目ですね。休みまえに大阪から乗ってきたのですが、重いの一言です。緑の自転車は鳳駅においているので、普段はなかなか洗う事ができなかったので、一緒にメンテもしました。
  シフトケーブル:多少延びていた程度。
  ブレーキ;かなり延びたと言うより、ブレーキパッドがかなり減っている。
       メーカーのブレーキではないので、こんなものかな??




高野山ネタ

最近よく高野山に登っているので、いろいろ仕入れた情報があるので、ブログに残しておきます。
[気温]
最初に気温は8月で25度くらいですか。。5度以上は涼しい。

8月11日 11時頃

8月12日 11時頃

[コンビニ]
高野山にもコンビニがありました。更に、ガリガリ君も売ってました。今まで高野山の上ではガリガリ君はあきらめていたので、本当に助かります。
場所は、メインの通りではないので、普通は見つける事ができません。一つ中に入った、高野山大学の通りです。

[中華料理]
観光客相手ではない中華料理店を見つけました。店の名前は『ミッチー』
食べたのはトンカツ定食です。一応は中華料理店ですが、結構いろんなメニューはありました。地元の食堂って感じです。お勧めは中華定食みたいです。
トンカツ定食¥750

それにしても高野山に登っているのに体重は下がりませんね。体重が下がらないので、タイムも1時間20分と相変わらず変わりません。来月の上旬には大台ケ原ヒルクライムなのに。。