2015年8月 1日 (土)

[Ruby][Rails] Rails で DB と連携しない model を作る

Rails 4.2.3 での話。

Rails の model は、データベースとひもづくようになっているのだけど データベースとひもづかない model を作りたいときもある。

Googleで調べてみたら、なんかいろいろコードを書いて実装したりとか、そういう機能だけを提供するgem を見かけたりもしたのだけど 本家本元の RailsGuides にちゃんと書いてありました。

ActiveModel Basics 1.7 Model

ここによると、ActiveModel::Model を include すれば、そのクラスは、validation とか使えるし、 View で form_for で利用することもできると書いてあります。

確認のため、試してみた。

$ rails new model_without_db
$ cd modle_without_db
$ bin/rails c
irb(main):001:0> class FooDb < ActiveRecord::Base
irb(main):002:1> end
=> nil
irb(main):003:0> FooDb
=> FooDb (call 'FooDb.connection' to establish a connection)
irb(main):004:0> FooDb.new
ActiveRecord::StatementInvalid: Could not find table 'foo_dbs'
 ... (以下略)

そうなのだ。ActiveRecord::Base を継承する場合は、ちゃんとテーブル(DB)がないとインスタンスすら作れない。

では、いよいよ、ActiveModel::Model を試してみよう。

irb(main):007:0> class FooWithoutDb
irb(main):008:1> include ActiveModel::Model
irb(main):009:1> end
=> FooWithoutDb
irb(main):010:0> FooWithoutDb
=> FooWithoutDb
irb(main):011:0> FooWithoutDb.new
=> #<FooWithoutDb:0x007f64080fbdb0>
irb(main):012:0>

おおっ。インスタンスができてる。ってこれだけじゃ意味ねーじゃん。ということで、validation も使えるか試してみる。

irb(main):012:0> class FooWithoutDb
irb(main):013:1> attr_accessor :foo
irb(main):014:1> validates :foo, presence:true
irb(main):015:1> end
=> {:presence=>true}
irb(main):016:0> foo = FooWithoutDb.new
=> #<FooWithoutDb:0x007f64080976d0>
irb(main):017:0> foo.valid?
=> false
irb(main):018:0> foo.foo = 'hogehoge'
=> "hogehoge"
irb(main):019:0> foo.valid?
=> true

おおっ。ちゃんと validation も使えそう。

このあと、もうちょっと試してみたけど、実際に app/model 配下に、ActiveModel::Model をinclude したクラスのファイルを作って View とちょっとだけ連携してみたら、それっぽく動作してくれた。 Rails も便利になったものです。(機能が増えすぎて複雑怪奇になっているとも...)

FooWithoutDb.build や FooWithoutDb.create は使えないので、RSpecとかでテスト書くときには、注意した方がいいかも。

ちなみに、ActiveModel Basics は、'Work in progress' (2015-08-15現在)なので まだまだ新しい情報が追加されるかも知れません。

残念ながら、日本語翻訳ページの Active Model の基礎 には、この説明がまだありません(2015-08-15現在)。

» 続きを読む

| | コメント (0) | トラックバック (0)

2015年7月26日 (日)

[Bootstrap] dl-horizontal

次のようなslimがあるとBootstrapは、期待通りの配置をしてくれる。

.container
  dl
    dt 見出し1
    dd 説明1
    dt 見出し2
    dd
      dl.dl-horizontal
        dt 見出し2-1
        dd 説明2-1
        dt 見出し2-2
        dd 説明2-2

が、次だと "説明2-1" だけ、期待した通りに配置してくれない。

.container
  dl.dl-horizontal
    dt 見出し1
    dd 説明1
    dt 見出し2
    dd
      dl.dl-horizontal
        dt 見出し2-1
        dd 説明2-1
        dt 見出し2-2
        dd 説明2-2

試しに scss ファイルに

dl {
  dl {
    clear: both;
  }
}

と書いたら、それっぽくなった。

| | コメント (0) | トラックバック (0)

2015年7月17日 (金)

[Ruby] Ruby技術者認定 Gold 2.1

Ruby技術者認定試験 Gold 2.1 の証明書が送られてきた。 封筒が2つに折り曲げられていた。折角の合格証も微妙に折れ曲がっていた。 封筒に「二つ折り厳禁」と赤で書かれていると良かったのに。

| | コメント (0) | トラックバック (0)

2015年7月11日 (土)

[Ruby][Rails] Rails と PostgreSQL

Rails で PostgreSQL を利用しようとしてはまる。 なんか全然、接続できないし、

$ bin/rake db:create

とかやっても、何のエラーメッセージも出さず、かといって、いつまで経っても終了しない。

$ bin/spring status

とやったら

<defunct> ruby

とか表示されたので、こいつか、と思い、

$ bin/spring stop
$ bin/rake db:create

とやったら、何事もなかったかのように普通に終了した。

ずっと、database.yml とか PostgreSQL の設定とか、そっちばかり見ていて、spring には思い至らず、無駄に時間を使ってしまった。

| | コメント (0) | トラックバック (0)

[Ruby] 2.2.2のインストール

そうか。Ruby 2.2.2(というかそれ以外でも) をビルドするときに、ruby は必要なかったのか。 trunk をビルドすることが多いので、なんかすっかり忘れていた。

Windows 環境だと、まっさらの状態のときは、Cygwin 標準の Ruby をインストールして trunk をビルド。 (trunk は cygwin と mswin 版の両方をビルド。)

Ubuntu でも、OS をインストールしたときは、Ubuntu 標準の Ruby をインストールして trunk をビルド。

とかしていたので、気づかなかった。

| | コメント (0) | トラックバック (0)

[Ruby] Ruby技術者認定 Silver 2.1

Ruby技術者認定試験 Silver 2.1 の証明書が送られてきた。

| | コメント (0) | トラックバック (0)

2015年6月16日 (火)

[Programming] Bootstrap 3 で input タグのボタンの glyphicon 追加

すぐには例が見つからなかったので、メモ。 .has-feedback クラスを持つ div で囲って、input と glyphicon をその中に書く(とよさそう)。

<div class="form-group">
<div class="input-group has-feedback">
  <input type="button" class="btn btn-primary form-control" value="ダウンロード">
  <span class="glyphicon glyphicon-download form-control-feedback"></span>
</div>
</div>

| | コメント (0) | トラックバック (0)

2015年6月11日 (木)

[Ruby] Ruby on Rails Tutorial のオリジナルと 日本語訳(その13)

日本語訳の11章オリジナルの12章 を読み終えた。 これで最後です。

やっぱり少し違いがあって

  • オリジナルには、「サンプルアプリケーションの機能を拡張する」の内容がなくなっている。 ただし、機能拡張のうち、パスワードリセットの機能は、オリジナルの10章で実際に実装している。
  • 参考資料とかも変わっててオンライン学習の資料が多くなっている。

全体を通して、オリジナルの方が、より初心者に向けた(と言ってもそんなに易しくはないが) Railsのチュートリアルに特化した形になっている気がした。 演習問題も易しくなっている。 テストを書けという問題も穴埋め式になっているし、日本語訳にあった正規表現を勉強してみようというような 問題も消えている。 テストもRSpecをやめてMinitestにしているし、多分、Railsのチュートリアルにより専念した形にして、 Rails以外のところは、できるだけ触れないようにしたのではないかと思う。

| | コメント (0) | トラックバック (0)

2015年6月10日 (水)

[Ruby] Ruby on Rails Tutorial のオリジナルと 日本語訳(その12)

日本語訳の10章オリジナルの11章を読み終えた。

テスト以外にも違いがある。

  • オリジナルには、画像ファイルのアップロード機能の実装がある。

| | コメント (0) | トラックバック (0)

2015年6月 8日 (月)

[Ruby] Ruby on Rails Tutorial のオリジナルと 日本語訳(その11)

オリジナルの10章を読み終えた。 この章はまるまる日本語訳にはない(最後まで読んでないので確実なことは言えないが、多分、新しく追加された章だと思われる)。

| | コメント (0) | トラックバック (0)

«[Ruby] Ruby on Rails Tutorial のオリジナルと 日本語訳(その10)