Archive for: 𔃸月 2012’

Rails モデルクラスにユティリティ関数を定義する

2012年8月28日 Posted by PURGE

Userモデル内で、属性がlast_nameとfirst_nameで、別々に定義されている場合、user_name のように、関数定義をしておくと便利。
また、DBにマスタとして定義していないモデルの属性もsexのように定義すると便利。

#coding: utf-8
class User < ActiveRecord::Base
  #
  # 属性情報
  # 
  attr_accessible :first_name, :last_name, :sex_cd

  def user_name
    attributes["last_name"] + attributes["first_name"]  
  end

  def sex
    {1 => "男性", 2 => "女性"}
  end
end

下記のように呼べる。

<%= user.user_name %>
<%= user.sex[user.sex_cd] %>

基本的なところで、ハマっていたのだが、モデルクラスに、#coding: utf-8を指定しないと変なエラーにハマる。気を付けよう。

Rails select_tag の onchangeイベントによる form_tag action属性の変更

2012年8月24日 Posted by PURGE

セレクトボックスを変更したタイミングでサブミットを呼びたいので、下記のように記述した。
form_tagとselect_tag を使用すると、下記のHTMLが吐き出される。

<%= form_tag :controller => "index", :action => "index" do %>
<%= select_tag(:area_id, options_from_collection_for_select(@areas, :id, :area_name, @area_id), \:onchange => "this.form.submit()") %>
<% end %>
<form accept-charset="UTF-8" action="/area/2" method="post">
    <select id="area_id" name="area_id" onchange="this.form.submit()">
      <option value="1">Japan</option>
      <option value="2" selected="selected">Thailand</option>
      <option value="3">USA</option>
      <option value="4">Canada</option>
      <option value="5">England</option>
    </select>
</form>

しかし、この方法だけだと、formの属性であるactionが、/area/2 のまま変わらない。
色々と試したが、javascriptで対応するしかないようだ。

<script type="text/javascript">
$(function(){
	$('#area_id').change(function() {
		$("form").attr('action', '/areas/' + $(this).val());
		$("form").submit();
	});
});
</script>

Javascriptで、formのactionを変更してsubmitする。
もう少しスマートな方法もありそうだが、これで良しとする。

Rails label と check_box_tag の使用

2012年8月23日 Posted by PURGE

label_tag と check_box_tag 複数を両立させようと思ったが、どうしても複数のチェックボックスタグがあると、label for のID属性が合わなくなりハマってしまった。

結局、無理してlabel_tag を使用することなく下記のように記述した。

<label>
	<%= check_box_tag "member[]", 1 %>金魚
</label>
<label>
	<%= check_box_tag "member[]", 2 %>鯉
</label>
<label>
	<%= check_box_tag "member[]", 3 %>亀
</label>

Windows7のスタートアップフォルダ

2012年8月9日 Posted by PURGE

分かり難い…。

C:\Users\ユーザ名\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup

Rails link_to にHTMLタグを含む文字列を挿入する

2012年8月9日 Posted by PURGE

最近は、CSSのスタイル等が複雑で、link_to で生成される文字の部分にHTMLタグを挿入したい場合がある。
この場合は、どうやら link_to のブロック構文というものも存在するようだ。

<%= link_to index_index_path do %>
    <i class="icon-home"></i>Home</a>
<% end %>	

これによって、下記のHTMLタグが生成される。

<a href="/index/index">
    <i class="icon-home"></i>Home
</a>

これは便利。
今後はブロック構文というものも勉強しよう。

Rails 部分テンプレートの引数の渡し方

2012年8月9日 Posted by PURGE

部分テンプレートを使用して、部分テンプレート内で条件分岐制御を行おうと思ってハマったことの覚え書き。

index.html.erb

<%= render "menu", :page => 1 %>

menu.html.erb (記述間違い)

  <% if :page == 1 %>
    <li class="active">
  <% else %>
    <li>
  <% end %>

上記は変数の記述間違い。
下記が正しい。引き渡し元の変数をそのまま使用していた。
理解がまだまだ甘い…。

menu.html.erb

  <% if page == 1 %>
    <li class="active">
  <% else %>
    <li>
  <% end %>

Rails 検証機能 :confirmation について

2012年8月9日 Posted by PURGE

Rails3 にて、パスワード等の再入力のフォームがあるが、下記のように記述したが、どうしても :confirmation => true の入力検証が効かない。

login.html.erb

<%= text_field_tag :email, nil, {:placeholder => "メールアドレス"}%>
<%= password_field_tag :password, nil, {:placeholder => "パスワード"}%>
<%= password_field_tag :password_confirmation, nil, {:placeholder => "確認パスワード"}%>

member.rb

class Member < ActiveRecord::Base
  #
  # 検証機能
  #
  validates :email, 
            :presence => true, 
            :uniqueness => true
  validates :password, 
            :presence => true,
            :confirmation => true
end

結論から言うと、controllerクラス内の記述がまずかったようだ。実際、上記のmodelクラスとViewの記述には間違いがない。

問題点は、@member.password_confirmation の部分を記述していなかったことだ。

検証機能は、saveメソッドが呼ばれた時に機能するらしい。
@memberオブジェクト内に、password_confirmationパラメータが設定されてない為に、うまく動作しなかったようだ。

register_controller.rb

  def register
    @member = Member.new
    @member.email = params[:email]
    @member.password = params[:password]
    # この部分の記述漏れ
    # ↓ ↓ ↓ ↓ ↓ 
    @member.password_confirmation = params[:password_confirmation] 
        
    if @member.save
      #ログイン情報セッション登録
      redirect_to index_path
    else
      reset_session
      redirect_to error_path
    end
  end

rails migrationファイルの作成

2012年8月8日 Posted by PURGE

テーブル定義の更新をする為に、普段は直接DBに接続して、alter table 等のSQLコマンドで定義を変更していたのだが、heroku においては、直接DBに接続する手段を未だ設定していないので、勉強を兼ねて、migrationファイルにてテーブル定義を変更しようと思う。

c:> rails generate migration ChangeColumnLengthFnameInMembers

すると、migrationファイルが作成される。
db/migrate/20120808XXXXX_change_column_length_fname_in_member.rb
ファイル名が長い・・・。

class ChangeColumnLengthFnameInMembers < ActiveRecord::Migration
  def up
  end

  def down
  end
end

up / down のメソッドがあるmigrationファイルが生成されるので、下記を追加する。
今回は、項目長さを変更することとする。

class ChangeColumnLengthFnameInMembers < ActiveRecord::Migration
  def up
    change_column :members, :fname, :string, :limit => 128, :null => false
  end

  def down
  end
end

そして、マイグレーションコマンド。

c: > rake db:migrate

うまくいったようだ。

rails i18n ja.yml の記述方法

2012年8月6日 Posted by PURGE

i18n対応にハマった時の覚え書き。
ja.yml の記述方法が良くわからなかった。

/view/members/_form.html.erb

  <div class="field">
    <%= f.label :last_name %><br />
    <%= f.text_field :last_name %>
  </div>
  <div class="field">
    <%= f.label :first_name %><br />
    <%= f.text_field :first_name %>
  </div>
  <div class="field">
    <%= f.label :email %><br />
    <%= f.text_field :email %>
  </div>
  <div class="field">
    <%= f.label :passwd %><br />
    <%= f.text_field :passwd %>
  </div>

/config/locales/ja.yml

ja:
  helpers:
    label:
      member: 
        last_name: 姓
        first_name: 名
        email: メールアドレス
        passwd: パスワード

ちなみに、サーバの再起動がないと、反映できないかと思っていたが、ja.ymlを変更すると即時に反映されます。

Windows7でApacheインストール後にハマったこと

2012年8月2日 Posted by PURGE

何気なくWindows7でApacheインストールみた。
XP同様いつもの如く、httpd.conf の設定を変えてみる。

ドキュメントルート等のApacheの設定しても、動作が変わらない。
何度も再起動した。ダメだ。

OSレベルでの不具合かと思ったら、Windows7って、Program Files以下のファイル編集は変更しても元に戻されてしまうようで。

つまらんことに、時間を費やしてしまった。

管理者権限があっても編集できないとは・・・。憤慨。
やっぱMacに完全に乗り換えようかな。