---
# System prepended metadata

title: 20220801 Rails 無名小站實作 (Rich) 文章CRUD
tags: [Rails, Ruby]

---

# 20220801 Rails 無名小站實作 (Rich) 文章CRUD
###### tags: `Ruby` `Rails`

github clone
注意需重新db migrate

新拿到專案注意:
webpack 出錯
解法:

```shell=
bundle install
yarn install (抓回相關套件 node module...)
rails db:migrate #if need
```


## 列表顯示文章資料

blogs controller 透過Article model生出所有已經存好的資料作為@articles
```ruby
  def index
    @articles = Article.all
  end
```

view index內用迴圈生出所有資料
```ruby
<% @articles.each do |article| %>
<%# 輸出才要加 "=" %>
<ul>
  <li>
     <%#= link_to article.title, article_path(article) %>
     <%= link_to article.title, article %>
  </li>
</ul>

<% end %>
```

```htmlmixed
<ul>
  <% @articles.each do |article| %>
    <li><a href="/articles/<%= article.id %>"><%= article.title %></a></li>
    <li><%= link_to article.title, "/articles/#{article.id}" %></li>
    <li><%= link_to article.title, article_path({id: article.id}) %></li>
    <li><%= link_to article.title, article_path(article.id) %></li>
    <li><%= link_to article.title, article_path(article) %></li>
    <li><%= link_to article.title, article %></li> 只有 article_path 可以這樣縮寫
    以上六種寫法皆相同 
  <% end %>
</ul>
```

Find(3)  找不到會出錯
find_by(id:3)找不到會顯示nil 若要找不到請他出錯加上驚嘆號find_by！(id:3)
效果一樣 但by可以後面加更多參數

* find系列 vs where
find 找到一個
find_by 找到一個
where 找一群 (陣列) > 找不到傳回空陣列

show
```ruby
    def show 
    # Article.find(3) #find直接接id，找不到會直接出錯activeRecord::RecordNotFound，建議使用這種比較激進
    # Article.find_by(id: 3) #find_by可以接id以外的東西，找不到會得到nil
    @article = Article.find(params[:id])  
```


## U update 更新

edit

```ruby=
# app/Controllers/articles_controller.rb
  def edit
    @article = Article.find(params[:id]) 
  end
```


## D delete 刪除

erb
```ruby
<%= link_to '刪除', article, method: 'delete' %>
<%# 上面會產生nofollow的效果，可以防止爬蟲，也可以method包在data內就不會有nofollow %>
<%= link_to '刪除', article, data: { method: 'delete' } %>
<%= link_to "刪除", article, method: "delete", data: {confirm: "是否刪除?"} %> 
```

html
```htmlmixed=
<a rel="nofollow" data-method="delete" href="/articles/2">刪除</a>
<a data-method="delete" href="/articles/2">刪除</a>
```

> `regexp = /<body>(\s|.)+<\/body>/`

* Turbolinks
沒有換頁，把所有連結綁架，抓好內容換body，效能較好
產生問題: 如果同一頁面head有js要執行，會因為抓到別頁的js合併而產生問題

Rails 內建ujs(unobtrusive JavaScript)，自動將每個站內連結產生turbolinks

[UJS解釋](https://www.writershelf.com/article/rails-unobtrusive-javascript-ujs-%E6%B7%B1%E5%BA%A6%E7%A0%94%E7%A9%B6?locale=zh-TW)

> https://rails.ruby.tw/working_with_javascript_in_rails.html


* begin rescue
包住可能出現錯誤或是例外的程式碼
ex: 亂改id的操作問題 => exception

* rescue_from
很多地方要用可以拉到controller level, 使用rescue_from

```ruby
  rescue_from ActiveRecord::RecordNotFound, with: :record_not_found

  private

  def record_not_found
    render status: 404, layout: false, file: "#{Rails.root}/public/404.html"
    # redirect_to blogs_path
  end
```

放public裡面的東西不會走一般路徑routes，可以直接拿
=> /404.html


### _form.html.erb
