Category: ‘Rails’

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>

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を変更すると即時に反映されます。

railsで階層構造にして、ルーティングエラー

2012年7月19日 Posted by PURGE

管理画面用のURLを別途同一アプリケーションの中で、ディレクトリ階層(/admin/index)を作りたいと思っていたが、ルーティングやらヘルパーやらモデルの動作が中々うまくいかない。

階層は下記のように構成

■ユーザ管理画面コントローラ
app/controller/admin/user_controller.rb

#リダイレクト
format.html {redirect_to admin_user_path(@user.id)}

■ユーザモデル
app/models/user.rb

■ユーザ管理画面ビュー
app/views/admin/users/_form.html.erb

<%= form_for([:admin, @member]) do |f| %>
<% end %>

■ルーティング設定
config/routes.rb

namespace :admin do 
  resources :members 
end

最終的には、下記のサイトにて素晴らしい情報が記載されていた。
感謝感謝!!

http://devml.blogspot.jp/2011/01/rails3routesnamespaceformfor.html

form_forの記述の仕方がまだ理解できていないのだが、とりあえず動作した。

form_for での actionのurl指定

2012年7月18日 Posted by PURGE

以前の記事で、http://www.whoocus.com/blog/?p=622階層をつけた場合に、別のことでハマったので覚書。

デフォルトの記述で、下記のようにフォームを指定すると、テンプレートエラーとなってしまう。

<%= form_for(@member) do |f| %>
<% end %>
ActionView::Template::Error (undefined method `members_path' for #<#<Class:0x00000103e5c7f8>:0x00000103e2de08>):
    1: <%= form_for(@member) do |f| %>
    2: 
    3: <% end %>

modelの階層も変わった為に当然 members_path が返されて、未知のメソッドだと怒られる。

そこで、form_forのヘルパー関数では、urlを指定できるようだ。

<%= form_for(@member, :url => admin_members_path) do |f| %>
<% end %>

すると動作する。

rails admin階層でのrouteパス設定

2012年7月10日 Posted by PURGE

railsにて、admin/index のように、階層を作成したい場合がある。
この場合、下記のようにコントローラを作成できるが、routing で引っかかる。

rails generate controller admin/index index

この場合、config/routes.rb にて namespaceを使用する。

  namespace :admin do
    get "index/index"
  end

はまったのが、下記のようにリンクを作成するとroutingエラーになる。

<%= link_to("管理画面へ", {:controller => index, :action => index} %>

そこで、下記コマンドでルーティング情報を表示してみる。

$rake routes
admin_index_index GET    /admin/index/index(.:format)

そのまま下記のように記述するが、またエラー。

<%= link_to("管理画面へ", admin_index_index %>

どうやら、を付けるようだ。

<%= link_to("管理画面へ", admin_index_index_path %>

うまくいった。