青山学院大学

前期試験 ・ 2019 年 7 月 29日 4 時限実施 ・ ページ

授業
科目
情報総合プログラミング
実習 II
学生番号 学科 学年 フリ
ガナ
  評点
                        氏名    
担当者 DÜRST, Martin J.
莊司・谷津・米澤

略語の説明 (18 点)

次の略語の正式名称と、Ruby on Rails に関連する詳しい説明を書きなさい。例を使ってもよい。

REST:
正式名称: Representational State Transfer
詳しい説明: ウェブ全体やウェブアプリの構造・設計のモデル、HTTP により「実装」。
アプリケーションに大事な「資源」 (英: resource; 例: ユーザなど) の情報がそれぞれ
独自の URI によってアクセス可能で、HTTP の GET/PUT/POST/DELETE メソッドに
よって操作可能になる。Ruby on Rails では controller で利用され、対応する
アクションが用意されている。REST の使用によって、アクションや URI の意味、名称、
操作が統一されている。

ORM:
正式名称: Object-Relational Mapper/ing
詳しい説明: データベースとオブジェクト指向言語の間の取次の仕組み
データベースを使う場合、query を SQL 書いて、オブジェクトを「手作業」で作成するのは
大変です。ORM はその変換 (と逆変換) を実装し、非常に使いやすいようにする。一つ一つの
テーブルにクラスを対応させ、テーブルの一つ一つの行にオブジェクト (インスタンス) を対応さ
せている。Rails についている ORM "ActiveRecord" は「設定より規約」を中心に、メタプログラ
ミングを使ってクラスに列ごとのアクセスメソッドなど様々な便利なメソッドを自動的に作成する。

MVC:
正式名称: Model-View-Controller
詳しい説明: ウェブのみならず対話的なアプリに幅広く使われる設計のパラダイム
Rails では MVC 原則に基づいて、Model は ActiveRecord という ORB を使って
データベースとの接続やデータに対するメソッドや validation, モデルの間の関係性を記述。
Controller では public なメソッドがアクションと呼ばれ、外からアクセス可能です。
アクセス制御、出力形式の選択などは controller 中心に行われている。
View は各アクションに対するテンプレートで HTML やその他の形式を作成する。

コードの分類 (12 点)

下記のコード断片をそれぞれを HTML/CSS/Ruby/Ruby on Rails (Rails) に分類し、さらに細かく分類し説明しなさい。

例: movies.each: Ruby, 配列 (Array) の要素一個一個の繰返し

numericality: Rails, モデルで値が数値であることを検証

text-align: CSS で文書の揃え方 (左揃え、両端揃え)

assert_equal: Ruby (Rails を含む) のテストで結果の等しさをチェック

resources: Rails の routing で REST 用 routing に使用

ol: HTML で番号付き箇条書き

has_and_belongs_to_many: Rails, モデルで多対多の関係を示す

前期試験 ・ 2019 年 7 月 29日 4 時限実施 ・ ページ

(合計 18 点)

Ruby on Rails における最も大事な原則の一つに「設定より規約」がある。これについて二つの例を挙げ、細かく説明しなさい。(それぞれ 5点)

例 1:Rails のディレクトリ構造
Rails は全てのアプリケーションにおいて共通のディレクトリ構造を使っています。rails new
コマンドで必要なディレクトリとファイルが自動生成される。app サブディレクトリにはアプリケー
ションの主なファイルが model, controller, view サブディレクトリで配置される。
他の主なディレクトリは db (データベースそのものやデータベースの更新のためのマイグレー
ション) config (routes.rb などの設定)、test (テスト関連) です。

例 2:Rails データベースのテーブル名とクラス名
データベースのテーブル名は小文字で、複数となっています (例: users)。なぜ複数かというと、
テーブルに複数のデータ項目が入っているから複数が自然であるからです。かわりにプラス名
は頭文字が大文字で、単数です (例: User)。Ruby のクラス名は大文字から始めないといけ
ないし、クロスのインスタンスはそれぞれ一個のデータ項目を表しているので、単数が自然。
Rails は少し不規則な単数・複数の変換 (例: libraries ↔ Library) にも対応している。

「設定より規約」の利点について説明しなさい。(4点)

まず「設定より規約」によって、記述の量が減って、そのため開発のスピードが上がる。 次に、規約で決まったものについては命名、場所など悩まなくて済むためも開発のスピードが上がる。 さらに、物の場所や名前が規約によって決まっているため、自分が後日にアプリを変更するとき、他人と共同開発する、 ウェブで問題の解決策を調べる時など有利です。

「設定より規約」の欠点について説明しなさい。(4点)

開発できる前にある程度規約を覚えていないと使えません。 しかし、設定の仕方も覚えてないと使えません。規約と違うことが必要な場合 (例えば古いデータベースへの対応) 葉設定が必要になるが、Rails ではこれもできます。
(例: has_many :jobs, foreign_key: "user_id", class_name: "Task")

コマンドの出力の解釈 (12 点)

あるコマンドを実行したとき、出力の一部として次の二行が出力された。
     logout DELETE /logout(.:format)
            sessions#destroy

使われたコマンドを書きなさい。rails routes

出力の各部分を説明しなさい。最初の logout は logout_path や logout_uri で使う部分、DELETE は HTTP のメソッド名、/logout は URI の path の部分、括弧内だから任意の .:format は形式を示す拡張子 (.html, .json など)、sessions はコントローラ名、destroy はアクション名です。

授業へのコメント / Comment on Course (6 点)

この授業で一番分かりにくかったことを書きなさい (決まった正解はありません)
What was most difficult to understand in this course (there is no single answer)

@@@@

この授業で一番勉強になったことを書きなさい (決まった正解はありません)
What was most informative/interesting in this course (there is no single answer)

@@@@

青山学院大学

前期試験 ・ 2019 年 7 月 29日 4 時限実施 ・ ページ

授業
科目
情報総合プログラミング
実習 II
学生番号 学科 学年 フリ
ガナ
  評点
                        氏名    
担当者 DÜRST, Martin J.
莊司・谷津・米澤

CSS による枠の作成 (12 点)

次のそれぞれのスタイル指定による枠の上下左右の幅、スタイル (点線など)、色を右側の表に記入しなさい。

 
    border: 2pt solid blue;
    border-top-color: red;
    border-bottom-style: dashed;
    border-right-width: 5pt;
  
 
2pt 2pt 2pt 5pt
スタイル solid 点線 solid solid
 
 
    border-color: green blue red;
    border-width: 1pt 3pt 5pt 10pt;
    border-style: solid dashed;
  
 
1pt 5pt 10pt 3pt
スタイル solid solid dashed dashed
 

Ruby の文法 (5 点)

Ruby で end で終わる構文構造の最初の予約語を五つ書きなさい。

class, def, do, if, while (case, module, unless, until, for, begin)

ERB によるテーブルの作成 (14 点)

下記右側 (一部省略) のようなテーブルを作成する ERB のコード断片を書きなさい。三列からなり、一列目は n、二列目は n2
三列目は n3 である。n は 1 から 100 までの整数である。テーブルの一行目は表見出である。

<table>
  <tbody>
    <tr>
      <th>n</th>
      <th>n<sup>2</sup></th>
      <th>n<sup>3</sup></th>
    </tr>
    <% (1..100).each do |n| %>
      <tr>
        <td><%= n %></td>
        <td><%= n*n %></td>
        <td><%= n**3 %></td>
      </tr>
    <% end %>
  </tbody>
</table>
n n2 n3
1 1 1
2 4 8
3 9 27
... ... ...
100 10000 1000000

前期試験 ・ 2019 年 7 月 29日 4 時限実施 ・ ページ

newcreate の役割 (合計 23 点)

scaffold で作製されているコントローラには newcreate のアクションがある。両方の単語は、それぞれ同様に「新規作成」のような意味をもつ。二つのアクションの役割と、ユーザ (ブラウザ) 側から見た処理の流れ、それぞれどう異なるか説明しなさい。URI、HTTP のメソッドや図を使ってもよい。(10 点)

ブラウザ側                                           サーバ側
new をクリック → 例えば http://.../movies/new へアクセス (GET)
                                                    アクション new へアクセス、
                                                    new.html.erb のビュー
フォームをブラウザに                           ← (入力フォーム) を作成
表示、ユーザが記入、
サブミット    → http://.../movies へ送信 (POST)
                                                   入力データのチェック、
                                                   新オブジェクトの作成、
                                                  データベースに保存
新しく作成したオブジェクト                 ← show アクションにリダイレクト
をブラウザで表示

説明: 上記の図から見えるように、new がサーバからオブジェクト (リソース) 新規作成のための (空の) フォームを入手する。 フォームの投稿先は create アクションであり、そこでオブジェクトが作製され、データベースに追加されます。

movies_controllernew アクションが次のようになっている。 アクションの内容と自動的に行われる動作の解説をコードの右側に書きなさい。(5 点)

  def new
    @movie = Movie.new
  end

メソッド・アクション new は routing によって呼び出され、実行されます。
@movie のインスタンス変数にセットされる新しい Movie オブジェクトは
自動的に呼ばれるビューからもアクセス可能です。
そこでフォームの作成に使われる。新規のオブジェクトなので、
データ項目がなく、フォームの各欄も空になる。

movies_controllercreate アクションが次のようになっている場合、 以下の問い (9.3、9.4) に答えなさい。

  def create
    @movie = Movie.new(movie_params)

    respond_to do |format|
      if @movie.save
        format.html { redirect_to @movie, notice: 'Movie was successfully created.' }
        format.json { render :show, status: :created, location: @movie }
      else
        format.html { render :new }
        format.json { render json: @movie.errors, status: :unprocessable_entity }
      end
    end
  end

format はどのように選択可能かを、例を使って説明しなさい。(4点)

二つの方法がある: 拡張子による選択 (例: index.html, index.json) と HTTP の Accept ヘッダによる選択 (例: Accept: text/html; Accept: application/json)。

@movie.save の真と偽はそれぞれどのような意味をもつか、説明しなさい。(4点)

真は「問題なくデータベースに保存さてていました」という意味です。偽は何かのトラブル (例えば validation で弾かれたなど) を意味する。

青山学院大学

前期試験 ・ 2019 年 7 月 29日 4 時限実施 ・ ページ

授業
科目
情報総合プログラミング
実習 II
学生番号 学科 学年 フリ
ガナ
  評点
                        氏名    
担当者 DÜRST, Martin J.
莊司・谷津・米澤

Q & A フォーラム (20 点)

次の質問 (一部省略) が Q & A フォーラムにだされた。どのように回答すべきか答えなさい。

String can't be coerced into Integer (TypeError) の場合、どうしたらいいでしょうか。
文字列から明示的に .to_i で整数に変換して下さい。
Internal Server Error - Premature end of script headers への対応を教えて下さい。
CGI script の最初に必ず例えば Content-Type: text/html; charset=UTF-8
その後 \r\n を二回出力する
syntax error, unexpected end-of-input, expecting keyword_end の意味が分かりません。
Ruby のプログラム中に end が一つ (以上) 足りません。どこに追加するか探してください。
undefined local variable or method `hoge': なぜ変数かメソッドか区別できないのでしょうか。
メソッド呼び出しに () が必要ないので、定義されてない引数なしのメソッド呼び出しと定義されてない変数は Ruby の場合区別できません。
ブラウザでエラーが出ますが、非常におおざっぱで分かりにくいです。どこを見ればいいでしょうか。
二つのところがあります。一つ目はサーバを立ち上げたコマンドプロンプトです。もう一つはサーバの log です。
actors_controller.rb、new.html.erb、show.html.erb の3つのファイルはどのディレクトリに入れればいいのですか
最初は app/controllers、その次の二つは app/views/actors の中に入れてください。
ビューで XML を作成するファイルの拡張子はどうすればいいでしょうか。
.xml.builder となります。
bcrypt という gem を使いたいですが、インストールの細かいステップを教えてください。
Gemfile.lock を消す。Gemfile に bcrypt を追加する。bundle install を実行する。
roleを作ったのですが、adminといれても Role is not a valid role と返されました。他の role の値も同じです。
コントローラで、どのパラメタを許可するかを判断するメソッド (user_params) があります。そこに :role を追加して下さい。
マイグレーションをいくら変更してもデータベースが変わりません。手伝ってください。
マイグレーションを rails db:migrate で実行した後に変更しても全く効果がありません。 編集した部分を戻して、マイグレーションを rollback で元に戻して、編集した後にもう一回実行するのが正しい。