關於 rails api 傳遞參數命名問題


#1

大家好,

關於 rails api 參數命名,
目前觀念是,提供給對方api,
定義 json 資料欄位盡量不要與 DB 欄位相同,
避免 DB 欄位名稱被輕易得知,
但相對在 controller 那,
就必須逐個把 JSON 欄位轉成 DB 欄位,
再給 Model 去 new,
想請有無較好的做法?

以上,謝謝大家


#2

一般來說

User.all.to_json(only: ['id' , 'email'])
#=> [{"id":2,"email":"w**@**r"}]
User.first.to_json(only: ['id' , 'email'])
#=> {"id":2,"email":"w**@**r"}

至於其他,你可能要產生後用取代的,類似

template = {'"id"' => '"yooo"' , '"email"' => '"nooo"'}
'{"id":2,"email":"w**@**r"}'.gsub(/("id"|"email")/ , template)
#=> {"yooo":2,"nooo":"w**@**r"}

還要漂亮的話,你可能要覆寫 class 裡面的 to_json 的用法,裡面就可以針對細節來做產出就是了


#3

JC 大,上述是指針對送給對方時的處理嗎?
那關於接收的部分應該要怎麼處理呢?
假設接收 json 資料
{member:{“memberId”: “2”, “phone”, “0912345678”}…}
而 model 的 attributes 是 id、mobile_phone,
這樣要如何轉 memberId => id 、 phone => mobile_phone,
只能用取代的方式嗎?

謝謝!


#4

m~ 取得時反而簡單點,你可以用對照表之類的

COL_MAP = {
  'memberId' => 'id'
}
hash = {
  'memberId' => 123
}
ans = {}
hash.each_pair do |key , value|
  ans[COL_MAP[key]] = value
end

其實就過個轉換就好了唄?事實上我們家這類的對照表很多就是了


#5

資料完全不處理的話也許可以直接使用alias_attribute?

class User < ApplicationRecord
  alias_attribute :memberId, :id
  alias_attribute :phone, :mobile_phone
end
User.last.update(phone: "0912345678")
User.last.update(mobile_phone: "0912345678")