アプリを日本語化してみる
ビューファイル(*.rhtml)はどこに?
- Railsでは特に指定が無い場合、ビューのファイル名はアクション名と同じになる。
-
listの場合、app\views\memo\list.rhtml
- <% ~ %>で囲まれた部分はRubyの記述
list.rhtmlのテキスト部を日本語化する(抜粋)
<tr> <th>タイトル</th> <th>作成日時</th> <th>更新日時</th> <th>アクション</th> </tr> ~~~~~~~~ <td><%=h memo.title %></td> <td><%=h memo.created_at.strftime ("%y/%m/%d %H:%M") %></td> <td><%=h memo.update_at.strftime ("%y/%m/%d %H:%M") %></td> <td><%= link_to '表示', :action => 'show', :id => memo %></br> <%= link_to '編集', :action => 'edit', :id => memo %></br> <%= link_to '削除', { :action => 'destroy', :id => memo }, :confirm => '削除してよろしいですか?', :method => :post %></td> ~~~~~~~~ <%= link_to '前のページ', { :page => @memo_pages.current.previous } if @memo_pages.current.previous %> <%= link_to '新しいメモを追加', :action => 'new' %> <%= link_to '次のページ', { :page => @memo_pages.current.next } if @memo_pages.current.next %>
- link_toメソッドの表示部を書きかえる
- ファイルはUTF-8
- 日本語化して表示してみる
-
カラム名と日時表示を修正。Rubyの標準メソッド: strftime()
メモ帖新規作成部 new.rhtml を日本語化する(抜粋)
<H2 ALIGN="center">新しいメモを登録</H2> <% form_tag :action => 'create' do %> <%= render :partial => 'form' %> <%= submit_tag "メモを登録" %> <% end %> <%= link_to 'リストへ戻る', :action => 'list' %>
-
renderメソッドを使って別のファイルから読取られている。どこ?
:partial => 'ビュー名' したがって、app/views/コントローラ名/_ビュー名.rhtml
-
app\views\memo\_form.rhtml
<%= error_messages_for 'memo' %> <!--[form:memo]--> <p><label for="memo_title">表題:</label> <%= text_field 'memo', 'title' %></p> <p><label for="memo_body">本文</label><br/> <%= text_area 'memo', 'body' %></p> <!--[eoform:memo]-->
-
気になる 「error_messages_for」メソッド
- 引数で指定されたインスタンス変数のレコードの入力チェックを行って、エラーが生じていた場合は、そのエラーメッセージを表示する。
- @memoの内容にエラーがある場合に、エラーを表示
- エラー処理は、またね。
-
日本語化画面
Memo was successfully created. を日本語化
- 各アクションのビューを作成する場合、その枠になる「レイアウト」部分がある。
- 標準は「app\views\layouts\コントローラ名.rhtml」か、あるいは、「app\views\layouts\application.rhtml」
- Scaffoldを使うと、「app\views\layouts\コントローラ名.rhtml」
-
app\views\layouts\memo.rhtml(抜粋)
<head> <title>メモ帖: <%= controller.action_name %></title> <%= stylesheet_link_tag 'scaffold' %> </head> <body> <p style="color: green"><%= flash[:notice] %></p> <%= yield %>
- 「yield」メソッド。各アクションのビュー・ファイルが表示
- レイアウトファイルで、<HTML>や<BODY>を指定
- controller.action_name:アクション名
-
指定したスタイルシート:「stylesheet_link_tag」メソッドの引数
stylesheet_link_tag 'scaffold'
- 疑問?はてな? /stylsheets/scaffold.css はどこ?
ハッシュ「flash」の役割
- flash[:notice]の出力を、<p style="color: green">タグで緑色表示
-
flash
- ビューとコントローラ間でメッセージをやりとりする際に用いる、ハッシュ・テーブル(連想記憶配列)
- flash[:a]は、ハッシュ・テーブルの中のaというキーに対応する
- この値をセットしているのは、コントローラー!!!
- なぜ?
- データをコントローラからビューへ渡すときには、@から始まる変数(インスタンス変数)を使う
- コントローラで、@a 変数を作成するれば、それをビュー内でも使える。
- しかし、インスタンス変数を使えるのは、同じアクションだけ。
-
memo\app\controllers\memo_controller.rb
def create @memo = Memo.new(params[:memo]) // ← 入力メモ内容を保持(@memo) if @memo.save // ← DBへ保存 flash[:notice] // ← 保存が成功するとflashハッシュ = 'Memo was successfully created.' // 文字列をセット redirect_to :action => 'list' // ← listアクションへリダイレクト else render :action => 'new' // ← 保存が失敗したら new へ end end
- HTTPリダイレクト・ヘッダだけが出力されて、「http://localhost:3000/memo/list」へ移動して、listアクションが実行される。
-
変更前
flash[:notice] = 'Memo was successfully created.'
-
変更後
flash[:notice] = "#{(ERB::Util.h(@memo.title)}を保存しました"
- ””ダブル・クオーテェーションで囲まれた文字列の中で、「#{}」と書くと、括弧の中が実行され、その文字列に置換される。
- 「title」フィールドの値は、@memo.title で取り出せる。
-
ERB::Util.h()は、カッコの中をサニタイズする。
HTMLを生成するモジュールがビュー(View) Railsのビューは「Action View」と呼ばれる。 「ERB」という、Rubyに標準添付されているテンプレートエンジン