Module: TurboCrud::Controller
- Extended by:
- ActiveSupport::Concern
- Defined in:
- lib/turbo_crud/controller.rb
Constant Summary collapse
- DEFAULT_OPTION =
Object.new
- AUTO_AUTHORIZE =
Object.new
- RESOURCE_ACTIONS =
i[index new create edit update destroy].freeze
Instance Method Summary collapse
-
#turbo_create(record, list:, insert: DEFAULT_OPTION, success_message: nil, failure_status: :unprocessable_entity, redirect_to: nil, row_partial: nil) ⇒ Object
------------------------------------------------------------ turbo_create ------------------------------------------------------------.
-
#turbo_destroy(record, list:, success_message: nil, redirect_to: nil) ⇒ Object
------------------------------------------------------------ turbo_destroy ------------------------------------------------------------.
-
#turbo_respond(record, list: nil, insert: DEFAULT_OPTION, success_message: nil, failure_status: :unprocessable_entity, redirect_to: nil, replace: :row, row_partial: nil) ⇒ Object
------------------------------------------------------------ turbo_respond (NEW in v0.4) ------------------------------------------------------------ Drop-in responder for existing apps/controllers.
-
#turbo_save(record, list:, insert: DEFAULT_OPTION, success_message: nil, failure_status: :unprocessable_entity, redirect_to: nil, replace: :row, row_partial: nil) ⇒ Object
------------------------------------------------------------ turbo_save (v0.3) ------------------------------------------------------------ Convenience wrapper: calls turbo_create or turbo_update.
-
#turbo_update(record, success_message: nil, failure_status: :unprocessable_entity, redirect_to: nil, replace: :row, row_partial: nil) ⇒ Object
------------------------------------------------------------ turbo_update ------------------------------------------------------------.
Instance Method Details
#turbo_create(record, list:, insert: DEFAULT_OPTION, success_message: nil, failure_status: :unprocessable_entity, redirect_to: nil, row_partial: nil) ⇒ Object
turbo_create
229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 |
# File 'lib/turbo_crud/controller.rb', line 229 def turbo_create(record, list:, insert: DEFAULT_OPTION, success_message: nil, failure_status: :unprocessable_entity, redirect_to: nil, row_partial: nil) resolved_insert = insert.equal?(DEFAULT_OPTION) ? turbo_crud_default_insert_for(record) : insert resolved_row_partial = row_partial || turbo_crud_default_row_partial_for(record) validate_list_option!(list, method_name: :turbo_create) validate_insert_option!(resolved_insert) if record.save instrument_turbo_crud(:create, record: record, success: true, insert: resolved_insert) respond_to do |format| format.turbo_stream do render turbo_stream: turbo_success_streams( record, list: list, insert: resolved_insert, replace: nil, # create inserts; we don't replace by default success_message: , updating: false, row_partial: resolved_row_partial ) end format.html { redirect_to(redirect_to || record, notice: , allow_other_host: false) } end else instrument_turbo_crud(:create, record: record, success: false, error_count: record.errors.count) respond_to do |format| format.turbo_stream { render(**turbo_crud_template_for(:new), formats: :html, status: failure_status) } format.html { render :new, status: failure_status } end end end |
#turbo_destroy(record, list:, success_message: nil, redirect_to: nil) ⇒ Object
turbo_destroy
297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 |
# File 'lib/turbo_crud/controller.rb', line 297 def turbo_destroy(record, list:, success_message: nil, redirect_to: nil) validate_list_option!(list, method_name: :turbo_destroy) record.destroy instrument_turbo_crud(:destroy, record: record, success: true, destroyed: record.destroyed?) respond_to do |format| format.turbo_stream do streams = [ turbo_stream.remove(view_context.dom_id(record)), turbo_flash_stream(notice: ) ] streams << turbo_empty_state_stream(list) if turbo_list_empty?(list) render turbo_stream: streams.compact end format.html { redirect_to(redirect_to || polymorphic_url(list), notice: , allow_other_host: false) } end end |
#turbo_respond(record, list: nil, insert: DEFAULT_OPTION, success_message: nil, failure_status: :unprocessable_entity, redirect_to: nil, replace: :row, row_partial: nil) ⇒ Object
turbo_respond (NEW in v0.4)
Drop-in responder for existing apps/controllers.
You can keep your existing form partials + views. TurboCrud will:
- create => insert row into list
- update => replace row/target
- errors => render new/edit with 422
- always => update flash + close modal + close drawer
Example:
@post.assign_attributes(post_params)
turbo_respond(@post, list: Post, success_message: "Saved!")
Options:
- list: required for create (to know which list DOM id to insert into)
- replace: :row (default) or "custom_target" or nil
- row_partial: override partial lookup (e.g. "posts/post")
174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 |
# File 'lib/turbo_crud/controller.rb', line 174 def turbo_respond(record, list: nil, insert: DEFAULT_OPTION, success_message: nil, failure_status: :unprocessable_entity, redirect_to: nil, replace: :row, row_partial: nil) was_new_record = record.new_record? operation = was_new_record ? :create : :update resolved_insert = insert.equal?(DEFAULT_OPTION) ? turbo_crud_default_insert_for(record) : insert resolved_row_partial = row_partial || turbo_crud_default_row_partial_for(record) validate_insert_option!(resolved_insert) validate_replace_option!(replace) validate_list_option!(list, method_name: :turbo_respond) if was_new_record if record.save instrument_turbo_crud(operation, record: record, success: true, insert: resolved_insert, replace: replace) respond_to do |format| format.turbo_stream do render turbo_stream: turbo_success_streams( record, list: list, insert: resolved_insert, replace: was_new_record ? nil : replace, success_message: , updating: !was_new_record, row_partial: resolved_row_partial ) end format.html { redirect_to(redirect_to || record, notice: , allow_other_host: false) } end else instrument_turbo_crud(operation, record: record, success: false, error_count: record.errors.count) # 😬 Validation errors. Record said: "Nope. Try again, human." respond_to do |format| # If record is new, render :new; else render :edit. action = record.persisted? ? :edit : :new format.turbo_stream { render(**turbo_crud_template_for(action), formats: :html, status: failure_status) } format.html { render action, status: failure_status } end end end |
#turbo_save(record, list:, insert: DEFAULT_OPTION, success_message: nil, failure_status: :unprocessable_entity, redirect_to: nil, replace: :row, row_partial: nil) ⇒ Object
turbo_save (v0.3)
Convenience wrapper: calls turbo_create or turbo_update.
217 218 219 220 221 222 223 224 |
# File 'lib/turbo_crud/controller.rb', line 217 def turbo_save(record, list:, insert: DEFAULT_OPTION, success_message: nil, failure_status: :unprocessable_entity, redirect_to: nil, replace: :row, row_partial: nil) if record.persisted? turbo_update(record, success_message: , failure_status: failure_status, redirect_to: redirect_to, replace: replace, row_partial: row_partial) else turbo_create(record, list: list, insert: insert, success_message: , failure_status: failure_status, redirect_to: redirect_to, row_partial: row_partial) end end |
#turbo_update(record, success_message: nil, failure_status: :unprocessable_entity, redirect_to: nil, replace: :row, row_partial: nil) ⇒ Object
turbo_update
265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 |
# File 'lib/turbo_crud/controller.rb', line 265 def turbo_update(record, success_message: nil, failure_status: :unprocessable_entity, redirect_to: nil, replace: :row, row_partial: nil) resolved_row_partial = row_partial || turbo_crud_default_row_partial_for(record) validate_replace_option!(replace) if record.save instrument_turbo_crud(:update, record: record, success: true, replace: replace) respond_to do |format| format.turbo_stream do render turbo_stream: turbo_success_streams( record, list: nil, insert: nil, replace: replace, success_message: , updating: true, row_partial: resolved_row_partial ) end format.html { redirect_to(redirect_to || record, notice: , allow_other_host: false) } end else instrument_turbo_crud(:update, record: record, success: false, error_count: record.errors.count, replace: replace) respond_to do |format| format.turbo_stream { render(**turbo_crud_template_for(:edit), formats: :html, status: failure_status) } format.html { render :edit, status: failure_status } end end end |