カテゴリー : Ruby on Rails

[Ruby on Rails] JavaScript や CSS ファイル内で画像を読み込むときのパス(Path)の指定方法

Ruby on Rails にて、JavaScript や CSS ファイル内で画像を読み込むときのパス(Path)の指定方法を調べたのでメモ。

ちなみに、 画像ファイルへのPathはこんな以下のとおりです。

$ tree
.
├── app
│   ├── assets
│   │   ├── images
│   │   │   └── thickbox
│   │   │       ├── loadingAnimation.gif
│   │   │       └── macFFBgHack.png

画像ファイルが、
app/assets/images/thickbox/loadingAnimation.gif
にある場合、Pathは、

/assets/images/thickbox/loadingAnimation.gif

ではなく、images抜きの

/assets/thickbox/loadingAnimation.gif

というように指定しないといけません。

jQuery ライブラリ ThickBox のJavaScript、CSSファイル内で画像ファイルを指定している箇所を参考に変更箇所の例を書いてみました。

・参考:[jQuery] カンタンにDialogを表示できる「ThickBox」の使い方・参考記事まとめ | CodeNote.net はてなブックマーク - [jQuery] カンタンにDialogを表示できる「ThickBox」の使い方・参考記事まとめ | CodeNote.net

■ thickbox-compressed.js

・変更前

var tb_pathToImage = "images/loadingAnimation.gif";

・変更後

var tb_pathToImage = "/assets/thickbox/loadingAnimation.gif";

■ thickbox.css

・変更前

.TB_overlayMacFFBGHack {background: url(macFFBgHack.png) repeat;}

・変更後

.TB_overlayMacFFBGHack {background: url(/assets/thickbox/macFFBgHack.png) repeat;}

以上です。

【参考】

Rails 3.1 and Image Assets – Stack Overflow はてなブックマーク - Rails 3.1 and Image Assets - Stack Overflow

[Ruby on Rails] 入力フォームに時刻をフォーマットして初期値をセットする方法

Ruby on Rails 3.2.3 にて、入力フォームに時刻をフォーマットして初期値をセットする方法を調べたのでメモ。

フォームの一部を抜粋。下記のような感じで書く。

# app/views/articles/_article_form.html.haml
  %tr
    %th Published Time
    %td
      = f.text_field :published_at, value: (f.object.published_at.blank? ? '' : f.object.published_at.strftime('%Y/%m/%d %H:%M')

以上です。


参考情報

逆引きRuby – 日付と時刻

Format DateTime in Text Box in Rails – Stack Overflow

[Ruby on Rails] 他のテーブルへの外部キーを表すカラムを追加する方法(add_column, references)

Ruby on Rails 3.2.2 にて、他のテーブルへの外部キーを表すカラムを追加する方法を調べたのでメモ。

例えば、Usersテーブルへの外部キーを表すカラムを新規に作成する Testers テーブルに持たせるには、TableDefinition#referencesメソッドで追加できます。

rails g model tester title:string user:references

しかし、既存のテーブルに Usersテーブルへの外部キーを表すカラムを追加する場合は、referencesメソッドは使えません。

rails g migration add_user_to_tester user:references

この場合、外部キーは「テーブル名_id」というカラム名の形式で、整数型として定義してあげればOKです。

rails g migration add_user_id_to_tester user_id:integer

ちなみに、migration ファイルは下記のような感じです。
(外部キーのインデックスも張りました)

class AddUserIdToTester < ActiveRecord::Migration
  def change
    add_column :testers, :user_id, :integer
    add_index :testers, :user_id
  end
end

以上です。

【参考】

activerecord – Rails 3 migrations: Adding reference column? – Stack Overflow はてなブックマーク - activerecord - Rails 3 migrations: Adding reference column? - Stack Overflow

[Ruby on Rails] エラー:Range unspecified. Specify the :in, :within, :maximum, :minimum, or :is option.

Ruby on Rails 3.2.2 にて、model にバリデーション処理を書いて動かしてみたら、エラーが発生しました。

■ エラーメッセージ

Range unspecified. Specify the :in, :within, :maximum, :minimum, or :is option.

■ ソースコード(一部)

class Article < ActiveRecord::Base
  validates :title,
    length: { minimun: 0, maximun: 50 }
end

原因は、minimum, maximum をスペルミスしていたせいでした。

◯ minimum
☓ minimun

◯ maximum
☓ maximun

以上です。

[Ruby on Rails] ActiveRecord で setter と getter の実装方法

Ruby on Rails の ActiveRecord で setter と getter を実装する方法を調べたのでメモ。

define_method を使って、下記のように書くか、

class MyModel < ActiveRecord::Base
  define_method("hoge"){
    read_attribute "hoge"
  }
  define_method("hoge="){ |hoge|
    write_attribute "hoge", hoge
  }
end

もしくは、下記のように書くのもありです。

class MyModel < ActiveRecord::Base
  define_method("hoge"){
    self["hoge"]
  }
  define_method("hoge="){ |hoge|
    self["hoge"] = hoge
  }
end

以上です。

【参考】

ActiveRecordでsetterとgetterを実装する際の注意点(define_method使用) – しょぼエンジニアの仕事メモ はてなブックマーク - ActiveRecordでsetterとgetterを実装する際の注意点(define_method使用) - しょぼエンジニアの仕事メモ

define_method (Module) – Rubyリファレンス はてなブックマーク - define_method (Module) - Rubyリファレンス

[Ruby on Rails] 権限管理・認可を扱う「cancan」が便利

Ruby on Rails にて、権限管理や認可を扱う「cancan」という gem を使ってみました。

ryanb/cancan

カンタンに導入できて、かなり便利です。

使い方は、下記の記事を参考にしました。ありがとうございます。

cancan でモテカワ♥愛され権限管理 « blog.udzura.jp

Rails3.0 で Devise と CanCan を動かす – dimrosの日記

ASCIIcasts – “Episode 192 – Authorization with CanCan”

以上です。

[Ruby on Rails] 開発環境以外で Basic 認証を設定する方法

Ruby on Rails 3.2.3 にて、本番環境やステージング環境では Basic 認証を設定したいけど、開発環境では Basic 認証したくないときの設定方法をメモ。

開発環境でいちいち Basic 認証の User名、Password を入力するのは面倒ですものね。

app/controllers/application_controller.rb

class ApplicationController < ActionController::Base
 
  before_filter :password_protected unless Rails.env.development?
 
  protected
 
  def password_protected
    authenticate_or_request_with_http_basic do |username, password|
      username == "spam" && password == "spam_pw"
    end
  end
 
end

実行環境が”development”以外の時のみ、認証がかかるようになります。(ユーザ名:spam、パスワード:spam_pw)

以上です。

[Ruby on Rails] DBのカラムのデフォルト値を変更する方法

Ruby on Rails 3.2.3 にて、DBのカラムのデフォルト値を変更したのでメモ。

change_column_default(table_name, column_name, default)
Sets a new default value for a column.
 
Examples
change_column_default(:suppliers, :qualification, 'new')
change_column_default(:accounts, :authorized, 1)
change_column_default(:users, :email, nil)

・引用元:ActiveRecord::ConnectionAdapters::SchemaStatements はてなブックマーク - ActiveRecord::ConnectionAdapters::SchemaStatements

例えば、articles テーブルの title カラムの定義が「String型、NULL制約:有、デフォルト値:空文字」となっているのを、「String型、NULL制約:無、デフォルト値:NULL」に変更したい場合、マイグレーションファイルは下記のように書きます。

class ChangeTitleNullToArticles < ActiveRecord::Migration
  def up
    change_column :articles, :title, :string, null: true
    change_column_default :articles, :title, nil
  end
 
  def down
    change_column :articles, :title, :string, null: false
    change_column_default :articles, :title, ""
  end
end

以上です。

[Ruby][Rails] 厳選ライブラリ・ツールまとめ by WEB+DB PRESS Vol.67

「WEB+DB PRESS Vol.67」に掲載されている「Ruby わくわくナビ」で紹介されていた「厳選!用途別Ruby/Railsライブラリ・ツール」の一覧をメモ。

「機能の実装」「テスト」「作業の効率化」「運用」をテーマに色々と紹介されていました。

機能の実装編

ユーザ認証

plataformatec/devise はてなブックマーク - plataformatec/devise

NoamB/sorcery はてなブックマーク - NoamB/sorcery

ページネーション処理

amatsuda/kaminari はてなブックマーク - amatsuda/kaminari

パンくずリストの表示

zachinglis/crummy はてなブックマーク - zachinglis/crummy

アクセス権限の一括管理

ryanb/cancan はてなブックマーク - ryanb/cancan

画像のアップロード処理

thoughtbot/paperclip はてなブックマーク - thoughtbot/paperclip

markevans/dragonfly はてなブックマーク - markevans/dragonfly

レコードの削除を「論理削除」にする

radar/paranoia はてなブックマーク - radar/paranoia
 

テスト編

現在時刻に関係するテスト

jtrupiano/timecop はてなブックマーク - jtrupiano/timecop

bebanjo/delorean はてなブックマーク - bebanjo/delorean

メール送信処理のテスト

bmabey/email-spec はてなブックマーク - bmabey/email-spec

More Test!!

guard/guard はてなブックマーク - guard/guard

guard/guard-rspec はてなブックマーク - guard/guard-rspec

Growl はてなブックマーク - Growl
 

開発作業の効率を上げる

モデルの「表示に関する処理」を上手に扱う

amatsuda/active_decorator はてなブックマーク - amatsuda/active_decorator

オブジェクトの中身をきれいに表示する

michaeldv/awesome_print はてなブックマーク - michaeldv/awesome_print

処理途中のオブジェクトの中身を表示する

esminc/tapp はてなブックマーク - esminc/tapp

快適なREPL環境

pry/pry はてなブックマーク - pry/pry

Pry – an IRB alternative and runtime developer console はてなブックマーク - Pry - an IRB alternative and runtime developer console

Rubyistよ、irbを捨ててPryを使おう – TIM Labs はてなブックマーク - Rubyistよ、irbを捨ててPryを使おう - TIM Labs

モデルの属性に列挙型を使う

twinslash/enumerize はてなブックマーク - twinslash/enumerize

Twiwt:Blog / jugyo : enumerize 便利♡ – Enumerated attributes with I18n and ActiveRecord/Mongoid support はてなブックマーク - Twiwt:Blog / jugyo : enumerize 便利♡ - Enumerated attributes with I18n and ActiveRecord/Mongoid support
 

運用する

アプリケーションの設定を上手に管理する

binarylogic/settingslogic はてなブックマーク - binarylogic/settingslogic

アプリケーションのパフォーマンスを把握する

Web Application Performance Management (APM) : New Relic はてなブックマーク - Web Application Performance Management (APM) : New Relic

newrelic/rpm はてなブックマーク - newrelic/rpm

複数のアプリケーションを並行して開発する

Pow: Zero-configuration Rack server for Mac OS X はてなブックマーク - Pow: Zero-configuration Rack server for Mac OS X

rodreegez/powder はてなブックマーク - rodreegez/powder

Pow使うならPowder入れておくだァーッ! – Meltdown Countdown はてなブックマーク - Pow使うならPowder入れておくだァーッ! - Meltdown Countdown
 

以上です。

[Ruby on Rails][SQLite3] SQLException: Cannot add a NOT NULL column with default value NULL

Ruby on Rails にて、Usersテーブルに role カラムを NOT NULL 制約を付けて、追加しようとしたらエラーが発生しました。

■ エラーが発生した migration ファイル

db/migrate/20120415053115_add_role_to_users.rb

class AddRoleToUsers < ActiveRecord::Migration
  def change
    add_column :users, :role, :string, :null => false
  end
end

rake db:migrate すると、エラーが発生しました。

■ エラーメッセージ

$ rake db:migrate
==  AddRoleToUsers: migrating ============================
-- add_column(:users, :role, :string, {:null=>false})
rake aborted!
An error has occurred, this and all later migrations canceled:
 
SQLite3::SQLException: Cannot add a NOT NULL column with default value NULL: ALTER TABLE "users" ADD "role" varchar(255) NOT NULL
 
Tasks: TOP => db:migrate
(See full trace by running task with --trace)

SQLite3 では、NOT NULL制約を付ける場合にはNULL以外のDEFAULTを指定する必要があるみたいです。

DEFAULT を指定しないと NULL が入ってしまうので、そのせいで今回のエラーが発生したみたいです。

NOT NULL制約を付ける場合にはNULL以外のDEFAULTを指定して下さい

・引用元:さぼてん: SQLite でテーブルの変更・カラムの追加をする-ALTER TABLE はてなブックマーク - さぼてん: SQLite でテーブルの変更・カラムの追加をする-ALTER TABLE

なので、下記のようにカラム追加後に change_column で role カラムを NOT NULL に変更すればOKです。

class AddRoleToUsers < ActiveRecord::Migration
  def change
    add_column :users, :role, :string, :null => false
    change_column :users, :role, :string, :null => false
  end
end

また、素直に DEFAULT を指定してあげるのも一つの手です。

class AddRoleToUsers < ActiveRecord::Migration
  def change
    add_column :users, :role, :string, :null => false, :default => ""
  end
end

以上です。

【参考】

ruby on rails – SQLite3::SQLException: Cannot add a NOT NULL column with default value NULL – Stack Overflow はてなブックマーク - ruby on rails - SQLite3::SQLException: Cannot add a NOT NULL column with default value NULL - Stack Overflow