---
# System prepended metadata

title: 20220811 Rails 無名小站實作 (Rich) 新增部落格
tags: [Rails, Ruby]

---

# 20220811 Rails 無名小站實作 (Rich) 新增部落格
###### tags: `Ruby` `Rails`
## 如果不用axios，要怎麼手刻
rails內建也有類似axios的東西

```javascript=
import Rails from "@rails/ujs"
Rails.ajax({
  url: `/api/v1/articles/${articleId}/like`,
  type: "post",
  success: (resp) => {
    console.log(resp)
  },
  error: (resp) => {
    console.log(resp)
  },
})
```


為什麼ajax送到後端不會被擋。
因為他在後面默默做了一些事情，可以去翻翻原始碼看他做了什麼事。
另外送回來的東西已經是處理的物件，所以不用在打`(resp.data)`
如果打了會噴`undefined`(因為是對resp 物件找一個沒有定義的key)

來到api/articles_controller.rb
增加是否有會員登入(like需要會員登入)
```ruby=
class Api::V1::ArticlesController < ApplicationController
  before_action :authenticate_user! (, except: [:show, :unlock])#except這段好像不需要(?)

  def like
    article = Article.find(params[:id])

    if current_user.like_articles.include?(article)
      # 移除讚
      current_user.liked_articles.destroy(article)
      render json: {state: "unliked", id: params[:id]}
    else
      # 新增讚
      current_user.liked_articles << article
      render json: {state: "liked", id: params[:id]}
    end
  end
end
```

### Stimulus
- controller
- action
- target (用target就不需要下class, id, 也不需要用querySelector)
- 所有DOM都有dataset

`Stimulus`是為了讓前後端方便拿取資料而設計出來的。

static targets = ["likeButton"]

### 重新載入後，我按過讚的文章怎麼沒讚了？

> connect() 是一個callback, 只要data controller掛到DOM元素上就會觸發 
> 網頁一載入就會在掛上



在`user.rb`加上`like?`方法
```rb=
def like?(article)
  liked_articles.include?(article)
end
```
### 沒登入或開無痕，為什麼壞了？
這樣基本上就做完了，但是開無痕模式會壞，所以要做一個防呆機制給他。
因為current_user沒有東西，在一個空的東西用方法，錯誤訊息為
**NoMethodError** `undefined method [METHOD_NAME] for nil:NilClass`

加Ruby的lonely operator `&.` <- **在地上自己玩沙的小人**
JS的同樣判斷是用optional chaining operator `?.` 
:::info
題外話：
面試官:如果進到公司，你會想走哪一端？
我現在還很菜，我兩端都有興趣
:::

### 簡化 like_article.js 中重複的程式碼


### Throttle & Debounce 網頁效能改善/防駭
- 避免有心人寫一個狂按讚的程式 癱瘓資料庫(短時間大量存取資料會造成負擔)
[網頁效能問題改善之 Debounce & Throttle](https://ithelp.ithome.com.tw/articles/10222749)

## 誰來我家 Blog
![](https://i.imgur.com/GdCDSUt.png)

新增一個model Blog, 有url的uniq id叫做handler, user:blog一對一的關聯, 軟刪除 
```shell=
$ rails g model Blog handler title description:text user:belongs_to deleted_at:datetime:index
```

### blog_controller 中 article 的action部分移回去article_controller
原本article的index跟new都在blog controller

### blog CRUD




### BlogVisitor

`$ rails g model BlogVisitor user:belongs_to blog:belongs_to`

誰來我家

1. 進入部落格
1. 如果不是我家
1. 檢查有沒有來過
   1. 有來過>刪除紀錄>新增紀錄
   1. 沒來過>新增紀錄

