视频:https://gorails.com/episodes/actionable-errors-in-rails-6?autoplay=1

这篇视频介绍了Rails6的一个新功能:

actionable error

这个模块定义一个action来解决各种错误类型。通过在❌提示网页上添加了一个button按钮。一键处理相关的❌。

用法:

定义了一个"Run pending migrations" , 当遇到PendingMigrationError后,执行action块内的命令。

      #   class PendingMigrationError < MigrationError
# include ActiveSupport::ActionableError
#
# action "Run pending migrations" do
# ActiveRecord::Tasks::DatabaseTasks.migrate
# end
# end

解释:

这个功能用在了rails遇到错误时的渲染一个按键,用来对错误进行处理:

<% actions = ActiveSupport::ActionableError.actions(exception) %>

<% if actions.any? %>
<div class="actions">
<% actions.each do |action, _| %>
<%= button_to action, ActionDispatch::ActionableExceptions.endpoint, params: {
error: exception.class.name,
action: action,
location: request.path
} %>
<% end %>
</div>
<% end %>

button_to生成一个带一个button的form。用于提交由一系列options创建的URL。

ActionableExceptions

这个模块的call调用ActionableError.dispatch方法执行自定义的块内的命令。

    def call(env)
request = ActionDispatch::Request.new(env)
return @app.call(env) unless actionable_request?(request) ActiveSupport::ActionableError.dispatch(request.params[:error].to_s.safe_constantize, request.params[:action]) redirect_to request.params[:location]
end

案例:

//
rails g scaffold Post title
//2 打开本地网页localhost:300,由于没有执行rails db:migrate会报❌
//ActiveRecord::PendingMigrationError
//Migrations are pending. To resolve this issue, run: rails db:migrate RAILS_ENV=development
//然后附加一个按钮 "Run pending migrations"

点击这个按钮后会执行:migrate命令,可以在terminal上看到Migrating to CreatePosts (20190509031430).

利用actionable error可以自定义错误处理

在PostsController内添加一个对NoDataError类型错误的一键处理。

class PostsController < ApplicationController
... class NoDAtaError < StandardError
include ActiveSupport::ActionableError action "Run seeds" do
Rails.application.load_seed
end
end

def index
   @posts = Post.all
    raise NoDataError if @posts.none?
  end

进入localhost:3000/posts, 如果没有数据post就会进入❌页面,并添加一个button。

添加种子:在seeds.rb内添加:Post.create(title:"hello Error!")。

点击button,后会运行块内的load_seed命令。并重新渲染网页。

Rails6新特性actionable Error的更多相关文章

  1. ElasticSearch 5学习(10)——结构化查询(包括新特性)

    之前我们所有的查询都属于命令行查询,但是不利于复杂的查询,而且一般在项目开发中不使用命令行查询方式,只有在调试测试时使用简单命令行查询,但是,如果想要善用搜索,我们必须使用请求体查询(request ...

  2. [干货来袭]C#6.0新特性

    微软昨天发布了新的VS 2015 ..随之而来的还有很多很多东西... .NET新版本 ASP.NET新版本...等等..太多..实在没消化.. 分享一下也是昨天发布的新的C#6.0的部分新特性吧.. ...

  3. 【译】Meteor 新手教程:在排行榜上添加新特性

    原文:http://danneu.com/posts/6-meteor-tutorial-for-fellow-noobs-adding-features-to-the-leaderboard-dem ...

  4. ES6新特性概览

    本文基于lukehoban/es6features ,同时参考了大量博客资料,具体见文末引用. ES6(ECMAScript 6)是即将到来的新版本JavaScript语言的标准,代号harmony( ...

  5. TypeScript 2.0候选版(RC)已出,哪些新特性值得我们关注?

    注:本文提及到的代码示例下载地址 - Runnable sample to introduce Typescript 2.0 RC new features 作为一个Javascript的超集, Ty ...

  6. MySQL5.6 GTID新特性实践

    MySQL5.6 GTID新特性实践 GTID简介 搭建 实验一:如果slave所需要事务对应的GTID在master上已经被purge了 实验二:忽略purged的部分,强行同步 本文将简单介绍基于 ...

  7. IOS第三天-新浪微博 - 版本新特性,OAuth授权认证

    *********版本新特性 #import "HWNewfeatureViewController.h" #import "HWTabBarViewController ...

  8. Microsoft Dynamics AX 7 新特性探索 - Demo 部署(Part 1)

    Dynamics AX 7已经发布了一段时间了,我们知道这次微软为我们带来了许多令人激动的新特性.在这个系列里,Reinhard将揭开New Dynamics AX的神秘面纱,和大家一起探索这些新的特 ...

  9. JS魔法堂:ES6新特性——GeneratorFunction介绍

    一.前言       第一次看koajs的示例时,发现该语句 function *(next){...............} ,这是啥啊?于是搜索一下,原来这是就是ES6的新特性Generator ...

随机推荐

  1. Go语言中的打包和工具链

    包 所有Go语言的程序都会组织成若干组文件,每组文件被称为一个包.这样每个包的代码都可以作为很小的复用单元,被其他项目引用. 包名惯例 给包命名的惯例是使用包所在目录的名字.并不需要所有包的名字都与别 ...

  2. 3道入门字典树例题,以及模板【HDU1251/HDU1305/HDU1671】

    HDU1251:http://acm.hdu.edu.cn/showproblem.php?pid=1251 题目大意:求得以该字符串为前缀的数目,注意输入格式就行了. #include<std ...

  3. Git基本理解

    1.版本控制 Git 是一个分布式版本控制系统 (Distributed Version Control System - DVCS). 所谓版本控制,意思就是在文件的修改历程中保留修改历史,让你可以 ...

  4. Hadoop-(Flume)

    Hadoop-(Flume) 1. Flume 介绍 1.1. 概述 Flume是一个分布式.可靠.和高可用的海量日志采集.聚合和传输的系统. Flume可以采集文件,socket数据包.文件.文件夹 ...

  5. WEB小计

     使用vue的事件绑定时,应当使用.stop来阻止事件的传播   html 有捕获和冒泡两种事件机制

  6. centos服务器之间相互挂载(samba)

    前提:假设A服务器ip为:192.168.1.101 ,B服务器ip为:192.168.1.102现在要求把A服务器的/mnt/test 路径下的文件夹 共享到B服务器的/home/ceshi 下. ...

  7. Python(八) —— 异常(概念、捕获、传递、抛出)

    异常的概念 捕获异常 异常的传递 抛出异常 异常的概念 程序在运行时,如果 Python 解释器 遇到 到一个错误,会停止程序的执行,并且提示一些错误信息,这就是 异常 程序停止执行并且提示错误信息  ...

  8. C手写一个多线程,供java调用

    package com.tigger; public class MyThread { static { //装载库,保证jvm在启动的时候就会装载 System.loadLibrary(" ...

  9. bash 中 () {} [] [[]] (()) 的解释

    bash 中 () {} [] [[]] (()) 的解释 来源  https://www.cnblogs.com/fhefh/archive/2011/04/16/2017895.html bash ...

  10. git托管代码

    安装git 在github上创建仓库 搞钥匙 在vscode上托管 初次在不同电脑上上传代码报错 解决:git pull --rebase origin master 链接:https://blog. ...