ラベル rails の投稿を表示しています。 すべての投稿を表示
ラベル rails の投稿を表示しています。 すべての投稿を表示

2012年9月18日火曜日

バリデーションメッセージの日本語対応

en.yml の locale ファイルのトップにも書かれていますが、下記のサイトにアクセスすると、言語ごとに用意されています。
https://github.com/svenfuchs/rails-i18n/tree/master/rails%2Flocale

デフォルトは、英語なので、例えばName欄が空欄だと、下記のようなエラーになります。
"Name can't be blank"

日本語対応にすると
"Name を入力してください"
になります。

しかし、"名前 を入力してください"にしたいところです。

では、どうすれば良いのでしょうか。

ja.ymlのロケールファイルに下記のように記載します。
 activerecord:
    attributes:
      user:
        name: "名前"

こう書くことで、UserモデルのNameカラムを"名前"にして表示します。

【参考】
http://guides.rubyonrails.org/i18n.html#translations-for-active-record-models

バリデーションチェックのエラー表示場所

railsのscaffoldで生成したビューファイルにはエラーメッセージを表示する場所があります。

ここの部分ですね。
  <% if @admin_client.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@admin_client.errors.count, "error") %> prohibited this admin_client from being saved:</h2>

      <ul>
      <% @admin_client.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
      </ul>
    </div>
  <% end %>
ちなみに、このエラーメッセージ表示部をpartialで切り出して、@adminのところを引数で渡すようにすると、変更が容易になりました。

上記のメッセージ部とは別に、エラーが出ると、該当の項目が赤くなります。
しかし、この赤い部分は見た目的にもイマイチで、レイアウトが崩れることもあるので、
非表示する場合の設定がこちら。
config/application.rb に、下記を追加します。
config.action_view.field_error_proc = Proc.new {|html_error, instance| "#{html_error}".html_safe }

【参考】
http://techlog.knocking.co.jp/archives/1161

数値の3桁区切り

Railsにはさまざまな便利なヘルパーが用意されています。
例えば、数値を3桁ごとにカンマを入れたい場合は、number_with_delimiter() を使います。

詳細はこちら
http://api.rubyonrails.org/classes/ActionView/Helpers/NumberHelper.html
他にも便利な数値系のヘルパーがあります。

3桁区切りでは、
Viewに下記のように書くと、
<%= number_with_delimiter(12345678, :delimiter => ",") %>
こんなふうに表示されます。
12,345,678

カンマ等の区切り文字は、ロケールファイルに切り出すのも良いでしょう。


2012年8月31日金曜日

テーブル行のしましま

Railsでテーブルの偶数・奇数行に異なる色を付けてシマシマにしたい場合
cycle が便利!
テーブルだけでなく、リストでも使えます。


View定義
<tr class="<%= cycle('even', 'odd')%>">
なお、cycleの引数は2つ以上取れます。例えば、red, yellow, blueにした場合は、3色が順になります。

CSS定義
.odd {background-color:#f6f7f8;}
.even {background-color: #fff;}

同じページで複数会cycle()を使うと、奇数行の場合にずれるので(奇数で終わると、次は偶数色から始まる)、その場合は、下記で一旦リセットする。
<% reset_cycle() %>


2012年8月30日木曜日

rails のlayout と 複数 yield と content_for

Railsのlayouotに複数yieldを埋め込みたい場合はどうすれば良いのでしょうか?

yieldに名前をつけてあげます。下記の例で言えば、:sidebar

<div id = "sidebar">
  <%= yield :sidebar %>
</div>

<div id="content">
  <%= yield %>
</div>

その際に、view側では、 content_for というタグを使って、
yield :sidebar のところに埋め込む部分を定義します。
例えば、partialでメニューを埋め込む場合はこんな感じ。
<% content_for :sidebar do %>
  <%= render(:partial => 'menu') %>
<% end %>

2011年7月29日金曜日

gem dependenciesのバージョンの見方

~> というちょっと変わった記号を見かけることがありますが、
これは何なの?ということで下記のサイトを教えてもらい、以下に抜粋しました。
http://stackoverflow.com/questions/3492772/gem-dependencies-versions-meaning
Specification From ・・・ To (exclusive)
">= 3.0"     3.0    ・・・ ∞
"~> 3.0"     3.0    ・・・ 4.0
"~> 3.0.0"   3.0.0  ・・・ 3.1
"~> 3.5"     3.5    ・・・ 4.0
"~> 3.5.0"   3.5.0 ・・・ 3.6


~>を検索で引っ掛けるのも難しいですよね…
ちなみにこの記号の読み方は下記のRubyGemsのマニュアルより、
「approximately greater than」だそうです。
http://docs.rubygems.org/read/chapter/16
"tilda greater than" でなんとかこちらのサイトがひっかかりました。

2011年7月14日木曜日

Redmineプラグインの設定・管理画面ラベル名の日本語化

Redmineでは、日本語なら、{プラグイン}/config/locales/ja.yml以下に
ラベル名等を記載していますが、設定画面のモジュールタブの所や、
権限の所はどうやって日本語にすれば良いのでしょうか?
と、いろいろ調べていたら、下記のように書けばできました。

・設定画面のモジュール部
project_module_xxx のように "project_module_"をprefixにつける。

・権限部
permission_view_yyy のように、"permission_"をprefixにつける。

init.rbにある下記部分からの命名のようです。
project_module :xxx do
    permission :view_yyy, {:zzz => [:update]}
  end

2011年7月13日水曜日

空チェック(empty? と blank?)について

変数等の中身をチェックする際に、
Rubyでは、プログラムの処理によっては、empty? と nil? の両方をチェックすることがあります。
例えば、nil?の可能性があるものに対して、empty?チェックだけを行うと下記のエラーが出ますよね。

> a = nil
> a.empty?
NoMethodError: undefined method `empty?' for nil:NilClass


Railsでは、両方をまとめてチェックしてくれる便利な blank? があります。
ただし、Rails以外で利用するには、モジュールを require する必要があります。

irbで実行するとこんな感じです。

> require 'rubygems'
> require 'active_support'
>
> a = nil
> b = ""
> c = []
>
> a.blank?
=> true
> b.blank?
=> true
> c.blank?
=> true

ちなみにrequireしなかった場合はこんなエラーになります。
> a.blank?
NoMethodError: undefined method `blank?' for nil:NilClass
> b.blank?
NoMethodError: undefined method `blank?' for "":String

なお、Rails2とRails3ではRequireするモジュールが異なるようなので、ご注意ください。
上記はRails2の例です。
Rails3はまだ入れていないので確認できていません…。

2011年7月12日火曜日

Railsのバリデーションチェック

モデルに書くバリデーションチェックのifオプションの記述方法では、
下記のような2通りの書き方ができます。
どちらも同じ動作をします。

①Procオブジェクトを利用
 
validates_numericality_of :value, :only_integer => true, :if => Proc.new { |p| p.name == "xxx"}
 

②メソッド切り出し
この時のメソッド名には「?」マークをつけるのは決まりのようです。
 
validates_numericality_of :value, :only_integer => true, :if => :is_num?

def is_num?
"xxx" == name
end
 

2011年7月7日木曜日

Railsのチェックボックスタグ

railsのチェックボックスタグ

railsのタグでよく迷うのが、
check_box と check_box_tag というような タグ名に"_tag" ありかどうか。

今回ハマったことは、
check_box_tag タグを用いた際に、チェックボックスにチェックが入ってないと
パラメータとして送信されないので、paramsの中に含まれなず、
コントローラ側の受け取りでparamsにあるかどうかチェックしたりしなくてはならないこと。

でも、check_box タグを使うとラクにできます。
こんなふうにかくと、単一の送信チェックボックスを作った場合。

<%= check_box("post","send",{:checked=>@xxx == "1"})%>

こんなふうに解釈されるのです。
チェックなし
<input id="post_send" name="post[send]" type="checkbox" value="1" />
<input name="post[send]" type="hidden" value="0" />
   
チェックあり
<input id="post_send" name="post[send]" type="checkbox" value="1" checked="checked" />
<input name="post[send]" type="hidden" value="0" />

もし、check_box_tag タグを使う場合は、hidden_field_tag タグと併用すると良いそうです。
参考: http://d.hatena.ne.jp/bottleneck/20070927/1190872024

2011年6月21日火曜日

remote_functionでAjax実装

function copy_memo(){
  <%= remote_function(:url => {:action => "copy_memo"}, 
                      :complete => "$('memo_area').value = request.responseText",
                      :with =>"'year='+$('year').value+
                '&month='+$('month').value+
                '&day='+$('day').value+
                                '&user='+$('user').value") %>
}


<input type="button" name="button" value="<%=l('copy_memo')%>" 
    onclick="copy_memo()" >


上のremote_functionで、下記を生成してくれます。
function copy_memo(){
new Ajax.Request('/xxx/copy_memo', 
                 {asynchronous:true, 
                  evalScripts:true,
                  onComplete:function(request){$('memo_area').value = request.responseText}, 
                  parameters:'year='+$('year').value+
                             '&month='+$('month').value+
                             '&day='+$('day').value+
                             '&user='+$('user').value +
                             '&authenticity_token=' +
                              encodeURIComponent('e2uxmpaqqD3l+bMWYOm3r+Yl7KKJuy4WbyNea1Wsc1E=')})
}

Rails2.3.11(あたり?)からCSRF対応で、authenticity_token が自動的にパラメータに追加されるようになったそうです。

remote_functionを使ってない場合は自分で実装を追加する必要があるのでremote_functionを利用するのが便利ですね。
最初は、remote_functionを使わずに実装していたのでログイン情報が消えてハマりました…。

ちなみにパラメータを渡すときは上記のように:with を使います。