Loading...
Loading...
Compare original and translation side by side
rails g modelrails g controllerrails g migrationrails g modelrails g controllerrails g migrationapp/models/strftimeapp/models/strftimecard.closeboard.publishcard.closed?card.golden?CloseablePublishableWatchableCards::ClosuresControllerscope :activescope :chronologicallycard.closeboard.publishcard.closed?card.golden?CloseablePublishableWatchableCards::ClosuresControllerscope :activescope :chronologically| Action | Route |
|---|---|
| close a card | |
| archive a card | |
| watch a board | |
| 操作 | 路由 |
|---|---|
| 关闭卡片 | |
| 归档卡片 | |
| 关注看板 | |
class Card::Closure < ApplicationRecord
belongs_to :card
belongs_to :creator, class_name: "User"
end
module Closeable
extend ActiveSupport::Concern
included do
has_one :closure, dependent: :destroy
end
def closed? = closure.present?
def close(creator: Current.user) = create_closure!(creator: creator)
def reopen = closure&.destroy
endclass Card::Closure < ApplicationRecord
belongs_to :card
belongs_to :creator, class_name: "User"
end
module Closeable
extend ActiveSupport::Concern
included do
has_one :closure, dependent: :destroy
end
def closed? = closure.present?
def close(creator: Current.user) = create_closure!(creator: creator)
def reopen = closure&.destroy
endundefinedundefinedclass Card < ApplicationRecord
include Assignable, Closeable, Golden, Watchable, Searchable
endclass Card < ApplicationRecord
include Assignable, Closeable, Golden, Watchable, Searchable
endundefinedundefinedundefinedundefinedundefinedundefinedundefinedundefined| Instead of | Prefer | When |
|---|---|---|
| | Join model needs attributes or callbacks |
| 1:N | M:N ( | Relationship may grow |
| | Type-safe variants with different schemas |
:dependenthas_manyhas_one:inverse_of| 不推荐 | 推荐 | 适用场景 |
|---|---|---|
| | 关联模型需要属性或回调时 |
| 1:N关系 | M:N关系( | 关系未来可能扩展时 |
| | 不同 schema 的类型安全变体 |
has_manyhas_one:dependent:inverse_ofundefinedundefinedundefinedundefinedundefinedundefinedundefinedundefinedmodule CardScoped
extend ActiveSupport::Concern
included { before_action :set_card }
private
def set_card
@card = Card.find(params[:card_id])
@board = @card.board
end
def render_card_replacement
render turbo_stream: turbo_stream.replace(@card)
end
end
class Cards::ClosuresController < ApplicationController
include CardScoped
def create = @card.close && render_card_replacement
def destroy = @card.reopen && render_card_replacement
endmodule CardScoped
extend ActiveSupport::Concern
included { before_action :set_card }
private
def set_card
@card = Card.find(params[:card_id])
@board = @card.board
end
def render_card_replacement
render turbo_stream: turbo_stream.replace(@card)
end
end
class Cards::ClosuresController < ApplicationController
include CardScoped
def create = @card.close && render_card_replacement
def destroy = @card.reopen && render_card_replacement
endclass Current < ActiveSupport::CurrentAttributes
attribute :session, :user, :account, :request_id
delegate :user, to: :session, allow_nil: true
endclass Current < ActiveSupport::CurrentAttributes
attribute :session, :user, :account, :request_id
delegate :user, to: :session, allow_nil: true
endmodule Watchable
def notify_watchers_later = NotifyWatchersJob.perform_later(self)
def notify_watchers
watchers.each { |w| WatcherMailer.notification(w, self).deliver_later }
end
end
class NotifyWatchersJob < ApplicationJob
def perform(card) = card.notify_watchers
endmodule Watchable
def notify_watchers_later = NotifyWatchersJob.perform_later(self)
def notify_watchers
watchers.each { |w| WatcherMailer.notification(w, self).deliver_later }
end
end
class NotifyWatchersJob < ApplicationJob
def perform(card) = card.notify_watchers
endstrftimeundefinedstrftimeundefined
Use `active_link_to` gem for navigation active states.
使用`active_link_to` gem处理导航激活状态。| Concern | Gem |
|---|---|
| Frontend | turbo-rails, stimulus-rails, importmap-rails |
| Assets | propshaft |
| Jobs | Solid Queue |
| Cache/Cable | Solid Cache, Solid Cable |
| Authorization | Pundit |
| Deployment | Kamal + Thruster |
| 功能模块 | Gem |
|---|---|
| 前端 | turbo-rails, stimulus-rails, importmap-rails |
| 资产处理 | propshaft |
| 任务调度 | Solid Queue |
| 缓存/长连接 | Solid Cache, Solid Cable |
| 权限控制 | Pundit |
| 部署 | Kamal + Thruster |
hwc-*hwc-*