はじめる!Rails3(1)13.4演習問題答え

13.4演習

1.ヘルパーメソッドdelete_link を定義し、これを利用してERB テンプレートを書き換えてください。


module ApplicationHelper
def delete_link(object)
link_to "削除", object, :method => :delete,
:confirm => "本当に削除しますか? "
end
end<%= delete_link(book) %>

2.ヘルパーメソッドlinks_for を定義し、これを利用してERB テンプレートを書き換えてください。


module BooksHelper
def links_for(book)
links = []
links << link_to("修正", [ :edit, book ])
if book.checked_out?
links << link_to("戻す", [ :restart, book ], :method => :put)
else
links << link_to("貸出", [ :check_out, book ], :method => :put)
links << delete_link(book)
raw(links.join(" "))
end
end
end<%= links_for(book) %>

はじめる!Rails3(1)12.5演習問題答え

12.5演習

1.貸し出し中の書籍を一覧表示するbooks#checked_out アクションを実装してください。


def checked_out
@books = Book.where(:checked_out => true)
render :action => "index"
end

2.書籍の一覧ページに「在庫」「貸し出し中」タブを設置し、書籍の検索条件を切り替えられるようにしてください。

<td><%= link_to "修正", [ :edit, book ] %>
        <%= if book.checked_out?
          link_to("戻す", [ :check_in, book ], :method => :put)
        else
          link_to("完了", [ :check_out, book ], :method => :put)
        end %>
        <%= link_to "削除", book, :method => :delete,
          :confirm => "本当に削除しますか? " %>
</td>

3.書籍を「在庫」に戻す(checked_out カラムの値をfalse にする)アクションbooks#check_inへのルーティングを設定してください。


Shelf::Application.routes.draw do
resources :books do
put :check_out, :check_in, :on => :member
get :checked_out, :on => :collection
end
end

4.書籍の一覧ページにbooks#check_in アクションへのリンクを設置してください。

<ul class="navigation">
<% if params[:action] == "index" %>
<li class="selected">在庫</li>
<% else %>
<li><%= link_to "在庫", :books %></li>
<% end %>
<% if params[:action] == "checked_out" %>
<li class="selected">貸出</li>
<% else %>
<li><%= link_to "貸出", [ :checked_out, :books ] %></li>
<% end %>
</ul>

ついでにテキストと同じようにスタイルシートも作成してしまいましょう。


ul.navigation {
width: 560px;
margin: 15px auto 5px;
list-style:none;
padding:0;
}

ul.navigation li {
display: inline;
margin-right: 1px;
background-color: #666;
border: solid 1px #ccc;
padding: 5px;
}

ul.navigation li.selected {
background-color: #eee;
}

ul.navigation li a {
color: #fff;
text-decoration: none;
}

5.books#check_in アクションを実装してください。


def check_in
@book = Book.find(params[:id])
@book.update_attribute(:checked_out, false)
redirect_to :back
end

はじめる!Rails3(1)11.7演習問題答え

11.7演習

1.書籍を「貸し出し中」にする(checked_out カラムの値をtrue にする)アクションbooks#check_out へのルーティングを設定してください。


Shelf::Application.routes.draw do
resources :books do
put :check_out, :on => :member
end
end

2.書籍の一覧ページにbooks#check_out アクションへのリンクを設置してください。

<td><%= link_to "貸出", [ :check_out, book ],
 :method => :put %></td>

3.books#check_out アクションを実装してください。


def check_out
@book = Book.find(params[:id])
@book.update_attribute(:checked_out, true)
redirect_to :back
end

check_outとchecked_outがごちゃごちゃにならないように気を付けなければいけませんね。

はじめる!Rails3(1)10.3演習問題答え

1.書籍を削除するbooks#destroy アクションを実装してください。


def destroy
@book = Book.find(params[:id])
@book.destroy
redirect_to :books
end

今更ですが一覧なので複数形に注意します。

2.書籍の一覧ページにbooks#destroy アクションへのリンクを設置してください。


<%= link_to "削除", book, :method => :delete,
:confirm => "本当に削除して宜しいですか?" %>

3.books リソースのルーティングテーブルを書いてください。

実際に作業したくさんのアプリケーションを組み合わせていくと分からなくなる恐れもあるため、この表は大事です。

動詞 URL パスの例 アクション役割
GET /books Index 一覧表示
GET /books/2 show 詳細表示
GET /books/2/new new 新規登録フォームの表示
GET /books/2/edit edit 修正フォームの表示
POST /books create レコードの追加(更新)
PUT /books/2 update レコードの変更
DELETE /books/2 destroy レコードの削除

はじめる!Rails3(1)9.6演習問題答え

1.書籍情報の修正フォームを表示するbooks#edit アクションを実装してください。


def edit
@book = Book.find(params[:id])
end


2.books#edit アクションに対応する ERB テンプレートを作成してください。

edit.html.erbを作成しnewを張り付けます。

<h1>修正</h1>

<%= form_for @book do |form| %>
<%= form.label :title, "タイトル" %>
<%= form.text_field :title %><br />
<%= form.label :authors, "作者" %>
<%= form.text_field :authors %><br />
<%= form.label :publish_year, "発行年" %>
<%= form.select :publish_year,
(Time.now.year - 20)..(Time.now.year) %><br />
<%= form.label :comment, "コメント" %>
<%= form.text_area :comment %><br />
<%= form.hidden_field :checked_out %>
<%= form.submit "送信" %><br />
<% end %>

3.書籍の一覧ページに書籍修正フォームへのリンクを設置してください。

<td><%= link_to "修正", [ :edit, book ] %></td>

を追加します。

4.書籍情報の登録フォームと修正フォームのERB テンプレートを部分テンプレートを用いて整理してください。

_form.html.erbを作成し共通部分をはりつけます


<%= form_for @book do |form| %><%= form.label :title, "タイトル" %><%= form.text_field :title %>

<%= form.label :authors, "作者" %><%= form.text_field :authors %>

<%= form.label :publish_year, "発行年" %><%= form.select :publish_year,
(Time.now.year - 20)..(Time.now.year) %>

<%= form.label :comment, "コメント" %><%= form.text_area :comment %>

<%= form.submit "送信" %>

<% end %>

5.書籍情報を更新するbooks#update アクションを実装してください。


def update
@book = Book.find(params[:id])
@book.update_attributes params[:book]
redirect_to @book
end

はじめる!Rails3(1)8.7演習問題答え

1.新しい書籍の登録フォームを表示するbooks#new アクションを実装してください。


def new
@book = Book.new
end

2.books#new アクションに対応する ERB テンプレートを作成してください。

New.html.erbを作成し以下のように編集します。

<h1>新規作成</h1>
<%= form_for @book do |form| %>
<%= form.label :title, "タイトル" %>
<%= form.text_field :title %><br />
<%= form.label :authors, "作者" %>
<%= form.text_field :authors %><br />
<%= form.label :publish_year, "発行年" %>
<%= form.select :publish_year,
  (Time.now.year - 20)..(Time.now.year) %><br />
<%= form.label :comment, "コメント" %>
<%= form.text_area :comment %><br />
<%= form.submit "送信" %><br />
<% end %>

ここで始めて出てきたコードがあります。<%= form.select :publish_year,(Time.now.year - 20)..(Time.now.year) %>
8章ではdateだった為form.date_select :due_date,と書いてましたが、今回はpublish_year(Integer)で発行年は整数をしてしているのでこう書きました。これはそれぞれ書き方が異なるので随時調べながら行うとよいでしょう!

3.書籍の一覧ページに書籍登録フォームへのリンクを設置してください。

index.html.erbの一番下に貼る


<%= link_to "新規登録", [ :new, :book ] %>

4.新規スタイルシートform.css を適宜作成してください。
新規ファイルform.css作成を作成して以下のように編集します。


form {
width: 540px;
margin: 4px auto;
background-color: #cff;
padding: 10px;
border: solid 1px #ccc;
}

form ul {
list-style:none;
margin:0;
padding:0;
}

form li {
clear: both;
margin:0;
padding:0;
}

form label {
display:block;
width:100px;
float:left;
padding-top:.2em;
}

form textarea {
height: 150px;
width: 430px;
float: left;
}

5.新しい書籍を登録するbooks#create アクションを実装してください。


def create
@book = Book.create(params[:book])
redirect_to @book
end

これでレコードが追加されたと思いきやされません。どうしてでしょうか・・・
それはchecked_outがnullのまま送られていたためtrueにもfalseにもなっていませんでした。
ですので

def newに@book.checked_out = falseを追加し
def createを@book = Book.create!(params[:book])と編集し
formに<%= form.hidden_field :checked_out %>を追加してやれば・・・いきましたね!!

はじめる!Rails3(1)7.8演習問題答え

1.貸し出しされていない(checked_out カラムがfalse である)書籍の題名、筆者、出版年を
一覧表示するbooks#index アクションを実装してください。

書籍の題名、著者、出版日、が表示できるようbooks#indexを編集します
books_controller.rb(貸出されていないということがfalseである場合)


def index
@books = Book.where(:checked_out => false)
end

2.books#index アクションに対応する ERB テンプレートを修正してください。

books#indexアクション対応のERBテンプレートを編集します

<% @books.each do |book| %>
  <tr>
    <td><%= link_to(book.title, book) %></td>
    <td><%= book.authors %></td>
    <td><%= book.publish_year %></td>
  </tr>
<% end %>

3.新規スタイルシートbooks.css を適宜作成してください。
(div id="book_authors" div id="book_publish_year"
div id="book_comment")を追加したのちにスタイルシートを作成します。

table.books {
width: 560px;
margin: 5px auto;
background-color: #eee;
border-collapse: collapse;
border-spacing: 0;
}

table.books tr {
border: solid 1px #ccc;
}

table.books td {
padding: 5px;
}

table.books col.title {
width: 320px;
}

table.books col.publish_year {
background-color: #ddd;
}

table class=”books”
col class=”title”
col class =”publish_year”


div#book_publish_year {
text-align: right;
color: #f00;
border: solid 1px #888;
padding: 5px;
}

4.本の一覧ページに詳細表示ページへのリンクを設置してください。


<%= link_to(book.title, book) %>→<%= link_to(book.title, book) %>

5.書籍の詳細情報を表示するbooks#show アクションを実装してください。

books#showを作成

<h1><%= @book.title %></h1>
<div id="main">
<%= @book.authors %><%= @book.publish_year %>
<%= @book.comment %>
</div>
<%= link_to "戻る", :books %>

6.books#show アクションに対応する ERB テンプレートを作成してください。

erbテンプレート作成


def show
@book = Book.find(params[:id])
end

7.スタイルシートbooks.css を適宜修正し、詳細表示ページのスタイルを整えてください。
books.cssを修正

div#book_publish_year {
text-align: right;
color: #f00;
border: solid 1px #888;
padding: 5px;
}