ル微王徴

アプリを日本語化

最終更新:

rubyocho

- view
メンバー限定 登録/ログイン

アプリを日本語化してみる

ビューファイル(*.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 %> 
  1. link_toメソッドの表示部を書きかえる
  2. ファイルはUTF-8
  3. 日本語化して表示してみる
  4. カラム名と日時表示を修正。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に標準添付されているテンプレートエンジン
      






目安箱バナー