railsで作る簡単な本棚アプリ (2)

railsで作る簡単な本棚アプリ (1) の続き。

新規のユーザを作る。

rails serverを起動させた状態で、http://localhost:3000/users を開く。
"New User"のリンクをクリックして、新規ユーザを作る。


新規の本を作る。

ユーザと同じ要領で、http://localhost:3000/books を開いて、"New Book"をクリックする。
下記のような本のデータ*1を作る。


BookShelvesControllerの修正

本棚のデータを作る前に、railsの生成したBookShelvesControllerのままだとエラーが出るので、修正する。

  • app/controllers/book_shelves_controller.rb
def create
  params[:book_shelf]['user'] = User.where(:id => params[:book_shelf]['user']).first # この行を追加
  params[:book_shelf]['book'] = Book.where(:id => params[:book_shelf]['book']).first # この行を追加
  @book_shelf = BookShelf.new(params[:book_shelf])

本当はparamsの中身をチェックしたり、nilチェックが必要だけど、今回は省略。
これで、BookShelfを作成できるようになる。

git add -u
git commit -m "本棚にデータを登録する時の型タイプエラーを修正"

本棚のデータを作る

http://localhost:3000/book_shelves を開き、"New Book shelf"をクリックする。
下記のデータを作る。

User Book
1 1
1 3
1 5

本棚のviewにユーザ名、本のデータを表示する

ユーザと本の表示がインスタンスのアドレスになっているので、この表示を修正する。

<table>
  <tr>
<% # ここから %>
    <th>User#name</th>
    <th>Book#Title</th>
    <th>Book#Price</th>
    <th>Book#R18</th>
    <th></th>
    <th></th>
  </tr>
 
<% @book_shelves.each do |book_shelf| %>
  <tr>
    <td><%= book_shelf.user.name %></td>
    <td><%= book_shelf.book.title %></td>
    <td><%= book_shelf.book.price %></td>
    <td><%= book_shelf.book.R18 %></td>
<% # ここまでを変更・追加 %>
    <td><%= link_to 'Show', book_shelf %></td>

http://localhost:3000/book_shelves の表示が下記のような表示になる。

git add -u
git commit -m "本棚のviewにユーザ名、本のデータを表示するように修正"

ユーザの所持してる本を表示する。

ユーザの名前が表示される http://localhost:3000/users/1 に所持してる本も表示するように変更する。

  • app/models/user.rb
class User < ActiveRecord::Base
  has_many :book_shelves # この行を追加
  has_many :books, :through => :book_shelves # この行を追加
end
  • app/controller/users_controller.rb
def show
  @user = User.find(params[:id])
  @books = @user.books # この行を追加
  • app/views/users/show.html.erb
  <%= @user.name %>
</p>

<% # ここから %> 
<% if @books.present? %>
  <table cellspacing="0">
    <tr>
      <td>Title</td>
      <td>Price</td>
      <td>R18</td>
    </tr>
  <% @books.each do |book| %>
    <tr>
      <td><%= book.title %></td>
      <td><%= book.price %></td>
      <td><%= book.R18 %></td>
    </tr>
  <% end %>
  </table>
<% end %>
<% # ここまで追加 %>
 
<%= link_to 'Edit', edit_user_path(@user) %> |

ここまで変更したら、http://localhost:3000/users/1 のviewにも所持している本のテーブルが表示されるようになる。

画面はこんな感じ

git add -u
git commit "ユーザの名前の下に所持している本を表示するように変更"

続き・・・

まだdefault_scopeもunscopedも出てないけど、続きはまた明日か明後日に。

*1:本の選択は中の人の好みとは関係ありません