2012年7月31日火曜日

Point of initial data insertion on Ruby on Rails3

Environment

ruby-1.9.3-p0, rails3.2.2, postgres

Grade

normal


seeds.rb uses to insert initial data for a new application.
for example, you can insert specified id (as id => 1) on postgres table. but sequence is not changed.
therefore, if you insert a new data on admin view, you will get duplicate key error.
you should set the sequence.

seeds.rb


obj1 = TestMaster.new(:id => 1, name => "test")
obj1.save
obj2 = TestMaster.new(:id => 2, name => "test")
obj2.save
// continue until 100

In the above seeds.rb, TestMaster table register the data from 1 to 100.
but, sequence id is not changed. primary id already exists and you will get duplicate key error.
The sequence is a special value that gets nextval function.
you need to add sequence update.

set sequence_id



obj1 = TestMaster.new(:id => 1, name => "test")
obj1.save
obj2 = TestMaster.new(:id => 2, name => "test")
obj2.save
// continue until 100

// set seq
connection = ActiveRecord::Base.connection();
connection.execute("select setval('test_master_id_seq',(select max(id) from test_master))")

As above, sql execute and set sequence value.
you can get correct primary key.

Thanks for reading.
bye!

Related Posts Plugin for WordPress, Blogger...

Ruby on Rails3で初期データ投入の注意点

環境はruby-1.9.3-p0, rails3.2.2, postgresです。

難易度★★★☆☆

railsアプリで初期データを投入する場合は、seeds.rbファイルを利用します。
しかし、初期データとしてpostgresのテーブルにidを指定したデータを投入すると、postgresのsequenceがセットされません。
そのため、管理画面等を作成してマスタに追加登録しようとすると、insertのときに失敗します。
そのため、sequenceの更新処理も同時におこなう必要があります。

seeds.rb


obj1 = TestMaster.new(:id => 1, name => "test")
obj1.save
obj2 = TestMaster.new(:id => 2, name => "test")
obj2.save
// continue until 100(100まで継続)

上記のseeds.rbでは、TestMasterテーブルにid1から100までのデータをinsertしています。
しかし、sequenceは変更されていないので、このまま新規登録処理をおこなうとsequenceがidに1を割り当て、重複キーエラーが発生してしまいます。
なので、seeds.rbにシーケンス更新する処理を追加する必要があります。

set sequence_id



obj1 = TestMaster.new(:id => 1, name => "test")
obj1.save
obj2 = TestMaster.new(:id => 2, name => "test")
obj2.save
// continue until 100(100まで継続)

// set seq
connection = ActiveRecord::Base.connection();
connection.execute("select setval('test_master_id_seq',(select max(id) from test_master))")

上記のように直接SQLを発行してシーケンスを設定します。
これでidとsequenceの同期が取れたことになります。

以上です。

参考サイト
Related Posts Plugin for WordPress, Blogger...

2012年7月26日木曜日

how to fix undefined method `per' on Ruby on Rails 3

Environment

ruby-1.9.3-p0, rails3.2.2, postgres

Grade

easy


Active Admin uses kaminari for pagination. My app uses will_paginate for pagination. So I got error.

undefined method `per' for #<ActiveRecord::Relation:0x007feba7775fe8>

I fixed this.

Open Gemfile


vi Gemfile

gem 'kaminari'

bundle install

adding the kaminari gem to app Gemfile. Confirm install.


gem list

kaminari (0.13.0)
...
will_paginate (3.0.pre4)

There are both will_paginate gem and kaminari gem in app. but this does not work. Need to create config/initializers/kaminari.rb. adding description.

kaminari.rb


Kaminari.configure do |config|
  config.page_method_name = :per_page_kaminari
end

You reboot server and login. Your app will operate normally.
Thanks for reading. bye!


helping site
Related Posts Plugin for WordPress, Blogger...

Ruby on Rails3でActive Adminを使ったページングエラーの対処

Active Adminでページングエラーが発生したのでメモ。

環境はruby-1.9.3-p0, rails3.2.2, postgresです。

難易度★★★☆☆

Active Adminは、デフォルトでkaminariを使ってページング処理を利用しています。私のアプリではページング処理にwill_paginateを利用していたので以下のエラーが発生しました。

undefined method 'per' for ##<ActiveRecord::Relation:0x007feba7775fe8#>

methodが定義されていないと警告されています。なので、kaminariを導入します。

Gemfileに記述


vi Gemfile

gem 'kaminari'

bundle install

gemを確認します。


gem list

kaminari (0.13.0)
...
will_paginate (3.0.pre4)

will_paginateとkaminariが両方入ったことになります。
しかしこのままでは動きません。config/initializers/kaminari.rbを作成し、以下の記述を行います。

kaminari.rb


Kaminari.configure do |config|
  config.page_method_name = :per_page_kaminari
end

あとはサーバーを再起動すれば動くはずです。

Active Adminは、管理画面を作成するのに本当に便利です。是非、使ってみてください。

以上です。


参考サイト
Related Posts Plugin for WordPress, Blogger...

2012年7月24日火曜日

エンジニアに読んでもらいたいエントリーのまとめ

今日はちょっと趣向を変えて、エンジニアに読んでもらいたいエントリーをまとめてみました。

1.零細IT企業の社長だけど、何か質問ある?

2chのまとめかな?2009年頃の記事です。調べものしている時にひっかかった記事だけど、全部読んじゃいました。
内容が少し古めだけど悪くないです。起業は失敗から学び、修正し続けることが重要です。

2.いいアジャイルと悪いアジャイル

これも古い記事です。2006年頃の記事です。内容は今でも通用します。読めば、海外も日本も基本は一緒ってことがわかると思います。
ただ、海外は間違いを認めて行動を修正する速度が違うんですよね。
あなたの勤める企業にも「テクニカルリード信奉者」のマネージャーがいるんじゃありませんか?

3.Getting Real

WEBアプリを開発するなら必ず読んで欲しいエントリー。37signalsの開発手法ですね。

4.ぼくはこうしてプログラミングを覚えた

フェイスブックのエンジニアで史上ベスト3に入るといわれるEvan Priestley氏への質問「どうやってプログラミングを覚えましたか」に対する本人からの答えです。本当にEvan氏の言う通りだと思います。

5.「基礎が大事」という本当の意味を理解しているか?

超良エントリー。継続的な勉強が必要なエンジニアさんは読んどきましょう。


とまあ、5つほど紹介してみたのですがどうでしょうか?
技術onlyでなく、たまにはこういうのもいいかなと思ってまとめました。

ネタがたまったらまた紹介したいと思います。
んじゃ

Related Posts Plugin for WordPress, Blogger...

2012年7月23日月曜日

Ruby on Rails3でActive Adminを使う

管理画面の作成にActive Adminを使ったのでメモ

環境はruby-1.9.3-p0, rails3.2.2, postgresです。

難易度★★★☆☆

Active Adminは、railsのプロジェクトで管理画面を作成します。
以下手順です。

Gemfile記述

gem "activeadmin"
gem 'sass-rails'
gem "meta_search",    '>= 1.1.0.pre'

install

rails g active_admin:install

以下が出力

      invoke  devise
    generate    devise:install
      create    config/initializers/devise.rb
      create    config/locales/devise.en.yml
  ===============================================================================

Some setup you must do manually if you haven't yet:

  1. Ensure you have defined default url options in your environments files. Here 
     is an example of default_url_options appropriate for a development environment 
     in config/environments/development.rb:

       config.action_mailer.default_url_options = { :host => 'localhost:3000' }

     In production, :host should be set to the actual host of your application.

  2. Ensure you have defined root_url to *something* in your config/routes.rb.
     For example:

       root :to => "home#index"

  3. Ensure you have flash messages in app/views/layouts/application.html.erb.
     For example:

       

<%= notice %>

<%= alert %>

4. If you are deploying Rails 3.1 on Heroku, you may want to set: config.assets.initialize_on_precompile = false On config/application.rb forcing your application to not access the DB or load models when precompiling your assets. =============================================================================== invoke active_record create db/migrate/20120722192139_devise_create_admin_users.rb create app/models/admin_user.rb invoke rspec create spec/models/admin_user_spec.rb insert app/models/admin_user.rb route devise_for :admin_users gsub app/models/admin_user.rb gsub config/routes.rb insert db/migrate/20120722192139_devise_create_admin_users.rb create config/initializers/active_admin.rb create app/admin create app/admin/dashboards.rb route ActiveAdmin.routes(self) generate active_admin:assets create public/javascripts/active_admin.js create public/images/active_admin create public/images/active_admin/admin_notes_icon.png create public/images/active_admin/datepicker/datepicker-header-bg.png create public/images/active_admin/datepicker/datepicker-input-icon.png create public/images/active_admin/datepicker/datepicker-next-link-icon.png create public/images/active_admin/datepicker/datepicker-nipple.png create public/images/active_admin/datepicker/datepicker-prev-link-icon.png create public/images/active_admin/loading.gif create public/images/active_admin/nested_menu_arrow.gif create public/images/active_admin/nested_menu_arrow_dark.gif create public/images/active_admin/orderable.png generate jquery:install --ui remove public/javascripts/prototype.js remove public/javascripts/effects.js remove public/javascripts/dragdrop.js remove public/javascripts/controls.js copying jQuery (1.7.2) identical public/javascripts/jquery.js identical public/javascripts/jquery.min.js copying jQuery UI (1.8.18) create public/javascripts/jquery-ui.js create public/javascripts/jquery-ui.min.js copying jQuery UJS adapter (caabad) remove public/javascripts/rails.js identical public/javascripts/jquery_ujs.js rake bourbon:install create public/stylesheets/sass/_bourbon.scss create db/migrate/20120723042152_create_admin_notes.rb create db/migrate/20120723042153_move_admin_notes_to_comments.rb

deviseなんかも勝手に入ります。認証周りをdeviseに移行したい衝動に駆られるが無視。

エラーメッセージ対応

このままweblickを立ち上げるとエラーメッセージが出力されるので、config/application.rbに以下のおまじないを記述


config.i18n.locale = :ja

さらにdevise.ja.ymlが必要です。devise.ja.ymlは/config/localesに配置します。ここのサイトからdevise.ja.ymlをダウンロードします。


config.i18n.locale = :ja

準備完了です。サーバーを立ち上げて、domain/adminで接続すると管理画面が表示されます。devise_create_admin_users.rbに記述してあるメールアドレスとパスワードでログインします。

ログインが出来て、ダッシュボードに遷移できれば成功です。あとは、必要なテーブルの管理画面を作成していきます。

サンプルとしてUsersテーブルの管理画面を作成してみましょう。

rails g active_admin:resource users

再びサーバーを立ち上げて、管理画面にログインしましょう。ダッシュボードにUsersリンクが表示されているはずです。
このように管理が必要なテーブルを作成していきます。カスタムが必要な場合は、変更も可能です。

以上です。


参考サイト
Related Posts Plugin for WordPress, Blogger...

2012年7月20日金曜日

Ruby on Rails3で文字数を数える

実行環境はruby1.9.3p0,rails3.2.2,postgres

難易度★★☆☆☆

railsアプリでテキストエリアに入力可能な残りの文字数をクライアント(ブラウザ)側でカウントしたかったので実装しました。

やり方

jqueryを利用します。テキストエリアに入力できる残りの文字数を表示します。

htmlコード


<textarea cols="50" id="text" maxlength="1000" name="text" placeholder="内容" rows="10"></textarea>
<div id="count_up">1000</div>

jqueryコード


$(function(){
  $("textarea").keyup(function(){
    var counter = $(this).val().replace(/\n|\r\n/g,"aa").length;// 改行を適当な二文字で置換
    $("#count_up").text((1000 - counter));
    if(counter === 0){
      $("#count_up").text("1000");
    }
  });
});

コードの説明

さて、上記のコードを見ると「おや?」と思った部分があると思います。おそらくreplace(/\n|\r\n/g,"aa")の部分だと思います。
この部分では、テキストエリア内に改行文字が含まれているとき、改行文字をaaという任意の2文字に置換しています。
なぜなら、railsは改行文字を二文字として認識するからです。
しかし、javaScriptでは一文字にしかカウントされません。
そのためこうしないと、rails側のvalidationの文字数とクライアント(ブラウザ)側の文字数が一致しなくなってしまいます。

railsで文字数取得


count = params[:text].split(//).size

lengthだとバイト数の取得となるので、上記のように配列にして正規表現で取得します。このとき、改行は二文字として認識されます。

最後に

入力文字数の多いテキストエリアで、残りの入力文字数を表示するのは良いインターフェースです。
それでわ。


参考サイト
Related Posts Plugin for WordPress, Blogger...

2012年7月12日木曜日

Ruby on Rails3でtwitter,google,yahooで認証する

実行環境はruby1.9.3p0,rails3.2.2,postgres

難易度★★★☆☆

rails3アプリにtwitter,google,yahooでの認証機能が欲しかったのでOmniAuthを使いました。

色々と勉強することが多かったです。以下に補足説明やリンク等をまとめました。

OmniAuthとは?

railsアプリでtwitter, faceBookのような第三者の認証方法を統合する方法です。

サンプルで勉強

まったく利用したことがない人は、ここでサンプルプロジェクトを作成しましょう。
一読して理解できる人はそのまま実装してしまいましょう。

twitter developerに登録

twitter developerに遷移し、create a new applicationで作成するアプリケーション用に新しいapplicationを作成します。これは幾つでも(?)作成できます。

twitterOAuth認証実装

ここのサイトの通りに実装します。詳細に記述されています。

twitterのOAuthについて理解しておくこと

参考サイトを見れば結構すんなりと実装できると思います。OAuthの仕組みを全く理解していなくてもなんとかなります。
しかし、それではまずいです。
OAuthは便利ですが、問題点も多くあります。openIdからOAuth、そしてOAuth2の基本は理解しておきましょう。
以下のサイトで知らないことはきっちりと勉強しましょう。僕は、ノートと問題を作って、繰り返し暗記と学習ができるようにしました。

google, yahooのopenId認証実装

ここのサイトの通りに実装します。詳細に記述されています。
上記のサイトでは、URIが大きすぎるというエラーがでると記載されていましたが、私の環境ではでませんでした。

googleをOAuth2で認証

ここのサイトの通りに実装します。詳細に記述されています。
googleでOAuth2を利用するにはGoogle APIs Consoleを利用できるようにする必要があります。
ここでKEY, SECRETを取得します。
しかし私の環境ではcallback時にURI did not matchがでてしまい、どうしても解決できませんでした。rails以外ならうまくいきます。ここはまだ解決できていません。
私は今回yahooとgoogleはopenIDで認証することにしました。

大事なこと

とにかく連携するソーシャルメディアを使いまくりましょう。
はっきりいって一番大事です。連携するソーシャルメディアで何ができるのか、そして何の情報を取得できるのか。この情報の取得は必要あるのか等等。とにかく使いまくりましょう。
どうしても日々の忙しさにかまけてしまい、利用する側としての時間が少なくなる人は多いでしょう。
私が今回facebook認証を実装しなかたのは、日本で利用するアプリではfacebookは不要と判断したからです。お年寄り専用アプリとかなら必要だと思います。この辺はがっちり利用していないと判断できません。

最後に

googleのOauth2, yahooのOAuth認証はなるべくはやめに実装したいと思います。
その時はまたまとめたいと思います。
それでわ。


参考サイト
Related Posts Plugin for WordPress, Blogger...

ピンタレストを使ってみた

SNSサービスのPinterest(ピンタレスト)を導入したので色々とメモ

ピンタレストって何?

画像系のSNSです。
twitter, facebookに次ぐSNSになるのではと言われています。

登録方法

このサイトの動画でとても詳しく説明されています。
現在は招待制で、私は登録一日後に招待メールが届きました。

とりあえず色々と使ってみましたが、シンプルでおしゃれな感じが好印象です。日本人にはこっちのほうが合っていると思いました。

なので、製品の紹介は、twitterやfacebookページでなく、こっちをメインに利用していこうと思います。
その際は、URLを貼付けるので確認してみてください。

参考サイト
Related Posts Plugin for WordPress, Blogger...

2012年7月8日日曜日

Ruby on Rails3で二重送信を防ぐ

実行環境はruby1.9.3p0,rails3.2.2,postgres

難易度★☆☆☆☆

Ruby on Rails3では、二重送信を防ぐ機能が備わっています。

submitタグに以下のようなoptionを追加します。

二重送信を防ぐsubmit_tagにする


<%= submit_tag '送信する', :data => {:disable_with => "保存中..."} %>

:disable_withは、submit時にボタンを無効化した時に表示するテキストです。 rails3.2より前の場合は:disable_withのみでも動いたようですが、3.2以降では動作しません。
必ず:data => {:disable_with => "{#text}"}と指定してください。以上です。

参考サイト
Related Posts Plugin for WordPress, Blogger...