這篇羅列導入 DDD 時遇到的困難,以及針對這些問題,在團隊內還沒有確切設計共識時,我們的處理方式。
Ransack 依賴 ActiveRecord
,導致不依賴 ActiveRecord
的 Boxenn 沒辦法使用。然而,專案中有不少地方使用到 Ransack 方便的 SQL 查詢功能,沒辦法輕易捨棄。
目前的解法是 controller 接到參數後,先利用 model.ransack
拿到 ActiveRecord::Relation
,再將其透過 factory
或 repository
拿到 entity
,另一種處理方式則是有 Ransack 的地方就不再透過 Boxenn 而是 ActiveRecord 拿到物件。
原本我們是用 Rails 的 model 直接透過 simple form 產生前端表格,然而很多時候 model 的欄位其實跟網頁中想要呈現的表格有落差,例如表格不想要出現某些欄位、某些 model 需要合併起來當一個表格填寫等等。
目前的解法是先在 controller 透過 OpenStruct
建立一個物件丟給 simple form 後產生前端表格,但中文化就得要手動調整,不能透過 rails 的 I18n 自動處理。
# controller.rb
class UserController < ApplicationController
def new
@user = OpenStruct.new(
name: nil,
id_number: nil,
gender: nil,
)
end
def create
# 將傳入的 params 做處理
end
end
# new.slim
= simple_form_for @user, as: :user, url: new_user_path, method: :post do |f|
= render partial: 'form', object: f, as: :f
# _form.slim
= f.input :name, label: '名稱'
= f.input :id_number, label: '身分證字號'
= f.input :gender, label: '性別', as: :select, collection: [['男', :male], ['女', :female], ['其他', :other]], input_html: { 'data-select': true }
= f.submit '確定', class: 'btn btn-success'
= button_to '取消', homepage_path, class: 'btn-muted'
下一篇會來說說除了實作外,我們在開發流程中做的變化。