---
# System prepended metadata

title: ＣＲＵＤ建立＆一些原理（三）

---

# ＣＲＵＤ建立＆一些原理（三）

在上一篇講完CRUD的Create

再來寫Read

## index

```ruby
class BooksController < ApplicationController
    
  def index
    @books = Book.all
  end
      
end
```

index的實體變數有個慣例，後面都會加s變複數。
Book.all是透過Book這個model從資料庫的table裡撈東西，all會把所有table的東西撈出來。
不過其實.all不寫也沒差，直接寫@book = Book的效果也是一樣。
如果想把出來的順序倒著列出來，可以這樣寫：

```ruby
class BooksController < ApplicationController
    
  def index
    @books = Book.order(id: :desc)
  end
      
end
```

再來寫index的view：

```erb
<h1>Hello World!!</h1>
    
<%= link_to "新增",new_book_path %>

<% @books.each do |book|%>
  
  <%= link_to book.title, book_path(book) %>
  
<% end%>
```

這裡用迴圈的方式把＠books內的資料通通跑出來，在這邊有一點要注意，```<% @books.each do |book|%>```在這行code寫的是<% %>，而不是<%= %>，寫<%= %>在頁面會印出來，<% %>不會。所以如果寫```<%= @books.each do |book|%>```會把所有的資料都印出來喔。


```<%= link_to book.title, book_path %>```這行會把所有的title列出來，title本身是超連結，會連到show去。
![](https://i.imgur.com/7tKUoUy.png)

```book_path(book)```book_path後面加一個(book)是因為我們需要找到路徑的:id

當Perfix與參數都一樣是book的時候，可以這樣寫：
```erb
<% @books.each do |book|%>
  
  <%= link_to book.title, book %>
  
<% end%>
```
這樣寫的效果跟寫book_path(book)一樣。

## show
寫到這裡，相信大家都知道下一步要寫什麼了吧。

沒錯就是show的action

```ruby
class BooksController < ApplicationController
    
  def show
    @book = Book.find(params[:id])
  end
      
end
```
我現在要透過model從資料庫拿資料，我要怎麼去篩選我要的東西？

這裡介紹三種常用的方法，find、find_by、where

**find:**

```Book.find(id)```find方法只能找id，如果寫Book.find(3)，那就會去找id: 3的資料。find有個優點，只要他找不到就會回報錯誤。

---


**find_by:**

```Book.find_by(title: "cat")```find_by可以找{key: value}，比find的條件相對自由，會取找符合條件的第一筆資料。但是如果找不到資料，find_by會回傳nil。


---

**where:**
```Book.where(title: "cat")```where的用法與find_by差不多，但不同的是，find_by只會找第一筆資料，而where會把所有符合條件的資料都找出來。



---
```params[:id] ```是什麼呢？在我們建立model的時候會有個默認的隱藏欄位id用來記錄流水編號。
在終端機輸入```rails routes```
![](https://i.imgur.com/MSSnLy7.png)
會發現edit/show/update/destroy這四個路徑都會有:id，也就是他們需要找到這個id。
而這筆id的資料會被params包起來，用類似hash的寫法。因此我們只需要寫```params[:id] ```就能抓到這個id。


---
controller寫完後接著寫view，建立show.html.erb

```erb
<h1>標題：<%= @book.title %></h1>
<p>內容：<%= @book.content %></p>
<span>價格：<%= @book.price %></span>
```


