# CRUD建立&一些原理(三) 在上一篇講完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去。  ```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```  會發現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> ```
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up