• Learn Rails5.2-- rails base(含官方指导Debugging 摘录)


    豆知识扩展:

    <meta> 

    https://www.cnblogs.com/chentianwei/p/9183799.html

    css selector

    div > p 选择所有父母是<div>的<p>元素。

    div p 选择所有在<div>内的<p>元素。

    个人理解 div.dialog特指类名是dialog的<div>元素 


    public

    文件夹下的html文件是静态网页,通过http://localhost:3000/hello-world.html.可以在浏览器打开。也可以不加上.html,rails默认自动增加html在url尾部。

    这个网页没有集成rails 框架。 

    用途:可以在Rails当前没有工作的适合使用这个网页。在产品环境下,你通常把经典的服务器放在rails server之前,从public目录可以自动的发送静态文件。 


    使用erb来创建动态dynamically的 HTML

    生成一个controller 加一个方法test:

    rails g controller example test 

    因为自动生成了route, get ''example/test", 所以通过example/test路径进入view的网页。 

    ⚠️,在public中的静态文件优先级高于router.rb中的配置路径。如果有同名的目录和文件。会优先使用public中的。比如:

    同时有app/views/example/test.html.erb和public/example/test.html会优先使用后者。

    <%= %> 会把输出转化为string。使用to_s。


    豆知识

    yield

    在 layouts目录中 ,可以设置不同的layouts。但如何引用进来,以前学习过,现在忘记了!

    http://guides.rubyonrails.org/layouts_and_rendering.html#using-nested-layouts 

    guide里有内嵌套layout.

    需要使用ActionView::Helpers::CaptureHelper#content_for()方法和content_for()?

    content_for 方法先存储一个块的markup标记,并给这个块一个名字identifier。

    然后,就可以使用这个块在一个模版的任意位置引用,或者其他的模版templates, layout或者module中了。

    用法,通过传递identifier作为content_for()的参数,即:content_for(:identifier) ,也可以使用yield(:identifier)

    ⚠️yield(:indentifier)不能在模块内使用。 


     Partial:

    使用render 渲染局部模版。ActionView::PartialRenderer#render

    例子:

    <%= render partial: "account", locals: { account: @buyer } %>

    之后在_accouont.html.erb中就可以使用局部变量account了。

    相当于使用了as别名。 

    Partial 可以传递局部变量,集合。

    Paritial同样可以使用不同的布局文件。

    render partial: "account", layout:"admin", locals: {account: @admin}

    render partail: "account", layout:"edit", locals: {edit: @edit} 

    _account.hmtl.erb使用了_admin.html.erb或者_edit.html.erb文件作为布局文件,它们都在同一个文件夹。

    如果传递的是一个conllection: @users。则每个user都会渲染一次partial。 

    另外, locals中的变量既可以被partial使用,也可以被layout使用。 

    ⚠️:locals还可以带一个块。 


     rails console

    2.5.1 :002 > Rails.env
     => "development"
    2.5.1 :004 > Rails.root
     => #<Pathname:/Users/chentianwei/下载的书籍/Learn Rails 5.2(基础书籍)/testproject>

    >> app.url_for(controller: 'game', action: 'ping')
    => "http://www.example.com/game/ping"

    >> app.get '/game/ping'
    Started GET "/game/ping"
    for 127.0.0.1 at 2018-01-17 17:14:50 +0100

       (0.2ms)  SELECT "schema_migrations"."version" FROM "schema_migrations"
    ORDER BY "schema_migrations"."version" ASC
    Processing by GameController#ping as HTML
    
      Rendering game/ping.html.erb within layouts/application
    
      Rendered game/ping.html.erb within layouts/application (54.4ms)
    Completed 200 OK in 898ms (Views: 884.8ms | ActiveRecord: 0.0ms)
    

    => 200 


    What Is a Generator? 

    http://guides.rubyonrails.org/generators.html

    一个非常重要的工具,自动化生成一些文件。生成器是可以客制化的。 


    Debugging (看文档)

    http://guides.rubyonrails.org/debugging_rails_applications.html#debug 

     RAils提供了一系列debug工具来显示开发者的早期的工作。

    • debug(object)方法ActionView::Helpers::DebugHelper#debug用于在视图中显示某个对象的属性信息。它会使用YAML格式渲染对象并在一个<pre>标签内返回信息。
    • 如:<%= debug @article %>

      

    web console

    一个rails 自带gem 'web-console'。和byebug类似,但是是在浏览器中运行。

    只能在开发环境加载gem。在view/page 上输入<% console %>,刷新网页底部出现控制台。

    也可以在controller的某个方法内加上console 。

    这个console执行纯ruby代码。可以定义和实例化客制的类,创建新的models和检测变量。

    教材上包含:安全政策的设置 

    在confilg/initializers/content_security_policy.rb中取消部分注释,作者说这是比较脏的快捷方法 。只能在开发环境使用。

    Rails.application.config.content_security_policy do |policy|
    #   policy.default_src :self, :https
      policy.font_src    :self, :https, :data
      policy.img_src     :self, :https, :data
      # policy.object_src  :none
    #   policy.script_src  :self, :https
      policy.style_src   :self, :https
     
    #   # Specify URI for violation reports
    #   # policy.report_uri "/csp-violation-report-endpoint"
    end

     The Logger

    在运行时,储存信息到log文件是很重要的。Rails为不同的运行环境保留了各自的日志文件。

    什么是Logger?

    ActiveSupport::Logger类,写log信息。 

    Log Levels

    有不同的等级 debug, info, warn ,error, fatal ,unknow.对应0-5

    发送信息

    写当前log,使用logger.(debug|info|warn|error|fatal)方法,在一个controller, model或mailer中。 

    class ArticlesController < ApplicationController
      # ...
     
      def create
        @article = Article.new(article_params)
        logger.debug {"New article: #{@article.attributes.inspect}"}
        logger.debug {"Article should be valid: #{@article.valid?}"}
     
        if @article.save
          logger.debug {"The article was saved and now the user is going to be redirected..."}
          redirect_to @article, notice: 'Article was successfully created.'
        else
          render :new
        end
      end

    之后在日志中就会有相关信息在rails server窗口显示并记录进log中:

    New article: {"id"=>nil, "title"=>"Debugging Rails", "body"=>"I'm learning how to print in logs!!!", "published"=>false, "created_at"=>nil, "updated_at"=>nil}
    Article should be valid: true

    日志是用于监控用户行为的! 属于安全领域,比如黑客恶意攻击的行为,可能就会被记录下来。


     Debugging with the bybbug gem 

    当你的代码没有按照期待的方式运行,你可以打印信息到logs或者使用web console, 或者用debug(object)来查找错误。

    不过有时候错误足迹的类型在查找问题引起的根源的时候,不是很有效。 当你实际需要走进运行的源代码时,debugger是一个好的gem.

    1 Setup

    gem install byebug。(2000✨)

    之后可以在任何位置插入byebug,比如测试时,或者在某个类中,运行时就会暂停, 见rails server窗口:

    [1, 8] in /Users/chentianwei/下载的书籍/Learn Rails 5.2(基础书籍)/testproject/app/controllers/example_controller.rb
       1: class ExampleController < ApplicationController
       2:   def test
       3:     byebug
    => 4:     @current_time = Time.now
       5:   end
       6:
       7:
       8: end
    (byebug)

    使用help见到许多方法。continue是继续。pasting

     https://github.com/deivid-rodriguez/byebug

     

    输入instance_variables 可以看到当前的实例变量名字。如果使用next进入下一步,再输入instance_variables就是此时的实例变量。是根据进程变化的。

    输入var.弹出帮助信息,可以选择all, args, const ,local, instance等,如输入var instance

    则列出所以此时的实例变量和它的值。 

    (byebug) var local
    self = #<ExampleController:0x00007fefd8c23c40>
    (byebug) var instance
    @_action_has_layout = true
    @_action_name = "test"
    @_config = {}

    ... 

    这是非常帮的方法,用来检测当前环境上下文的变量。 

    也可以检测一个对象的方法:var instance Article.new 会显示这个新建对象的所有方法。

    可以display @articles显示 1:@articles = nil 

    next命令是下一行。

    step命令是前进到下一个frame。

    breakpoint  

    不论何时碰到breakpoint ,都可以让你的程序暂停。

    你可以在rails server窗口内动态的增加,删除breakpoint。 

    • break n:在第n行设置断点
    • 还可以在某个文件,或类的方法上设置断点。 

    info breakpoints显示断点信息。

    delete n删除断点 

    continue继续执行,任何断点都会pass。 

    可以和pry-byebug一起使用。

     https://github.com/deivid-rodriguez/byebug

  • 相关阅读:
    Android:UI界面设计基础知识总结(一)
    Test:河北金力集团企业网集成
    Java中的异常处理try catch(第八周课堂示例总结)
    Java第七周课堂示例总结
    初入JavaWeb(半成品)
    Redis详解(4)--redis底层数据结构
    Go语言流程控制05--defer延时执行
    java==IO练习,文件切割合拼工具开发代码
    【洛谷 P3772】[CTSC2017]游戏(矩阵乘法+线段树)
    【LOJ #2865】「IOI2018」狼人(Kruscal重构树+扫描线)
  • 原文地址:https://www.cnblogs.com/chentianwei/p/9185145.html
Copyright © 2020-2023  润新知