<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>xiaoweirails (肖威)</title>
    <link>https://ruby-china.org/xiaoweirails</link>
    <description>才华横溢科技(北京)有限责任公司董事长,Ruby on Rails 程序猿,Go &amp; Beego程序猿，React-Native移动端工程师，BlockChain区块链开发，天使投资人;</description>
    <language>en-us</language>
    <item>
      <title>Let's Build: With Ruby on Rails - Job Board with Payments (实践思路) </title>
      <description>&lt;h2 id="Let's Build: With Ruby on Rails  - Job Board with Payments"&gt;Let's Build: With Ruby on Rails  - Job Board with Payments&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://ws2.sinaimg.cn/large/006tKfTcgy1fq9mmd5ufhj31kw0mvn07.jpg" title="" alt="image"&gt;
&lt;img src="https://ws1.sinaimg.cn/large/006tKfTcgy1fq9mmaemu7j31kw0smn0v.jpg" title="" alt="image"&gt;
&lt;img src="https://ws2.sinaimg.cn/large/006tKfTcgy1fq9mm41jxuj31kw0pcmze.jpg" title="" alt="image"&gt;
&lt;img src="https://ws2.sinaimg.cn/large/006tKfTcgy1fq9mlpfkprj31kw0jxwh0.jpg" title="" alt="image"&gt;
&lt;img src="https://ws3.sinaimg.cn/large/006tKfTcgy1fq9mlj5siwj31kw0j7mzb.jpg" title="" alt="image"&gt;&lt;/p&gt;

&lt;p&gt;这个案例是一个非常好的商业闭环的网站的设计。&lt;/p&gt;
&lt;h2 id="Github Repo:"&gt;Github Repo:&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://github.com/shenzhoudance/job_board_pay" rel="nofollow" target="_blank"&gt;https://github.com/shenzhoudance/job_board_pay&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="在案例的学习过程中，可以完成五个环节的学习；"&gt;在案例的学习过程中，可以完成五个环节的学习；&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;（1）功能体系：主要是完成一个招聘广告的发布，其中包含图片的上传；&lt;/li&gt;
&lt;li&gt;（2）用户体系：使用 gem 'devise' 具备普通用户和管理员用户，没有管理员的后台？需要加上管理员的后台吗？&lt;/li&gt;
&lt;li&gt;（3）设计体系：使用 gem 'bulma-rails'完成页面的设计工作，满足页面设计的需要；&lt;/li&gt;
&lt;li&gt;（4）支付体系：使用 gem 'stripe' 完成支付，在这个体系使用的时候，思考 RMVC 的架构，处在 job controller 里面完成 create 广告功能。&lt;/li&gt;
&lt;li&gt;（5）部署体系：使用 herkou 和 aliyun 完成部署，这一部分，没有完成，但是我可以完成教学；&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mkdir workspace
cd workspace
rails new job_board_pay
cd job_board_pay
git init
git status
git add .
git commit -m "initial commit"
git remote add origin https://github.com/shenzhoudance/job_board_pay.git
git push -u origin master
atom .
rails servwe
http://localhost:3000/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://ws3.sinaimg.cn/large/006tKfTcly1fq8rjie6uqj31ao1261kx.jpg" title="" alt="image"&gt;&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git checkout -b gem
---
gem 'devise', '~&amp;gt; 4.4.3'
gem 'bulma-rails', '~&amp;gt; 0.6.2'
gem 'simple_form', '~&amp;gt; 3.5.1'
gem 'gravatar_image_tag', github: 'mdeering/gravatar_image_tag'
gem 'sidekiq', '~&amp;gt; 5.0'
gem 'figaro'
gem 'carrierwave', '~&amp;gt; 1.0'
gem 'mini_magick', '~&amp;gt; 4.8'
gem 'stripe'
gem 'trix', '~&amp;gt; 0.11.1'
group :development, :test do
  gem 'better_errors', '~&amp;gt; 2.4'
  gem 'guard', '~&amp;gt; 2.14'
  gem 'guard-livereload', '~&amp;gt; 2.5'
end
&lt;/code&gt;&lt;/pre&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;bundle install
rails generate simple_form:install
bundle exec guard init
bundle exec guard

rails generate devise:install
rails generate devise User
rails g devise:views
rake db:migrate
rails s
http://localhost:3000/
&lt;/code&gt;&lt;/pre&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git checkout -b welcome
rails g controller welcome index
---
app/views/welcome/index.html.erb
---
&amp;lt;h1&amp;gt;欢迎来到才华横溢&amp;lt;/h1&amp;gt;
&amp;lt;p&amp;gt;这里是改变你命运的地方！&amp;lt;/p&amp;gt;

&lt;/code&gt;&lt;/pre&gt;&lt;pre class="highlight html"&gt;&lt;code&gt;app/views/layouts/application.html.erb
---
&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;JobBoardPay&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;csrf_meta_tags&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;stylesheet_link_tag&lt;/span&gt;    &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="na"&gt;application&lt;/span&gt;&lt;span class="err"&gt;',&lt;/span&gt; &lt;span class="na"&gt;media:&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="na"&gt;all&lt;/span&gt;&lt;span class="err"&gt;',&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="na"&gt;data-turbolinks-track&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="na"&gt;:&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="na"&gt;reload&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;javascript_include_tag&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="na"&gt;application&lt;/span&gt;&lt;span class="err"&gt;',&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="na"&gt;data-turbolinks-track&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="na"&gt;:&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="na"&gt;reload&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;yield&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
---
&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;才华横溢&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;csrf_meta_tags&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"viewport"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"width=device-width, initial-scale=1"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;stylesheet_link_tag&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="na"&gt;https:&lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="na"&gt;maxcdn.bootstrapcdn.com&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="na"&gt;font-awesome&lt;/span&gt;&lt;span class="err"&gt;/4.7.0/&lt;/span&gt;&lt;span class="na"&gt;css&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="na"&gt;font-awesome.min.css&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;stylesheet_link_tag&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="na"&gt;application&lt;/span&gt;&lt;span class="err"&gt;',&lt;/span&gt; &lt;span class="na"&gt;media:&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="na"&gt;all&lt;/span&gt;&lt;span class="err"&gt;',&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="na"&gt;data-turbolinks-track&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="na"&gt;:&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="na"&gt;reload&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;javascript_include_tag&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="na"&gt;application&lt;/span&gt;&lt;span class="err"&gt;',&lt;/span&gt; &lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="na"&gt;https:&lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="na"&gt;js.stripe.com&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="na"&gt;v2&lt;/span&gt;&lt;span class="err"&gt;/",&lt;/span&gt; &lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="na"&gt;https:&lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="na"&gt;js.stripe.com&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="na"&gt;v3&lt;/span&gt;&lt;span class="err"&gt;/",&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="na"&gt;data-turbolinks-track&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="na"&gt;:&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="na"&gt;reload&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;tag&lt;/span&gt; &lt;span class="na"&gt;:meta&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;name:&lt;/span&gt; &lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="na"&gt;stripe-public-key&lt;/span&gt;&lt;span class="err"&gt;",&lt;/span&gt; &lt;span class="na"&gt;content:&lt;/span&gt; &lt;span class="na"&gt;Figaro.env.stripe_publishable_key&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;body&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"&amp;lt;%= yield (:body_class) %&amp;gt;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt; &lt;span class="na"&gt;if&lt;/span&gt; &lt;span class="na"&gt;flash&lt;/span&gt;&lt;span class="err"&gt;[&lt;/span&gt;&lt;span class="na"&gt;:notice&lt;/span&gt;&lt;span class="err"&gt;]&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"notification is-success global-notification"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;p&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"notice"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;notice&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt; &lt;span class="na"&gt;end&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt; &lt;span class="na"&gt;if&lt;/span&gt; &lt;span class="na"&gt;flash&lt;/span&gt;&lt;span class="err"&gt;[&lt;/span&gt;&lt;span class="na"&gt;:alert&lt;/span&gt;&lt;span class="err"&gt;]&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"notification is-danger global-notification"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;p&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"alert"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;alert&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt; &lt;span class="na"&gt;end&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

     &lt;span class="nt"&gt;&amp;lt;nav&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"navbar is-light"&lt;/span&gt; &lt;span class="na"&gt;role=&lt;/span&gt;&lt;span class="s"&gt;"navigation"&lt;/span&gt; &lt;span class="na"&gt;aria-label=&lt;/span&gt;&lt;span class="s"&gt;"main navigation"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"navbar-brand"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;link_to&lt;/span&gt; &lt;span class="na"&gt;root_path&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;class:&lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="na"&gt;navbar-item&lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt; &lt;span class="na"&gt;do&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="nt"&gt;&amp;lt;h1&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"title is-5"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;才华横溢&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt; &lt;span class="na"&gt;end&lt;/span&gt;  &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"navbar-burger burger"&lt;/span&gt; &lt;span class="na"&gt;data-target=&lt;/span&gt;&lt;span class="s"&gt;"navbar"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="nt"&gt;&amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
          &lt;span class="nt"&gt;&amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
          &lt;span class="nt"&gt;&amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

      &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"navbar"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"navbar-menu"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"navbar-end"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"navbar-item"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"field is-grouped"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
              &lt;span class="nt"&gt;&amp;lt;p&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"control"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;link_to&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="na"&gt;Post&lt;/span&gt; &lt;span class="na"&gt;Job&lt;/span&gt;&lt;span class="err"&gt;',&lt;/span&gt; &lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="na"&gt;#&lt;/span&gt;&lt;span class="err"&gt;",&lt;/span&gt; &lt;span class="na"&gt;class:&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="na"&gt;navbar-item&lt;/span&gt; &lt;span class="na"&gt;button&lt;/span&gt; &lt;span class="na"&gt;is-primary&lt;/span&gt; &lt;span class="na"&gt;is-rounded&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
              &lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
              &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt; &lt;span class="na"&gt;if&lt;/span&gt; &lt;span class="na"&gt;user_signed_in&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
              &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"navbar-item has-dropdown is-hoverable"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;link_to&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="na"&gt;Account&lt;/span&gt;&lt;span class="err"&gt;',&lt;/span&gt; &lt;span class="na"&gt;edit_user_registration_path&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;class:&lt;/span&gt; &lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="na"&gt;navbar-link&lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"navbar-dropdown is-right"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                  &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;link_to&lt;/span&gt; &lt;span class="na"&gt;current_user.name&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;edit_user_registration_path&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;class:&lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="na"&gt;navbar-item&lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                  &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;link_to&lt;/span&gt; &lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="na"&gt;Log&lt;/span&gt; &lt;span class="na"&gt;Out&lt;/span&gt;&lt;span class="err"&gt;",&lt;/span&gt; &lt;span class="na"&gt;destroy_user_session_path&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;method:&lt;/span&gt; &lt;span class="na"&gt;:delete&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;class:&lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="na"&gt;navbar-item&lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
              &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt; &lt;span class="na"&gt;else&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;p&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"control"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
              &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;link_to&lt;/span&gt; &lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="na"&gt;Sign&lt;/span&gt; &lt;span class="na"&gt;In&lt;/span&gt;&lt;span class="err"&gt;",&lt;/span&gt; &lt;span class="na"&gt;new_user_session_path&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;class:&lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="na"&gt;navbar-item&lt;/span&gt; &lt;span class="na"&gt;button&lt;/span&gt; &lt;span class="na"&gt;is-rounded&lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;p&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"control"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
              &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;link_to&lt;/span&gt; &lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="na"&gt;Sign&lt;/span&gt; &lt;span class="na"&gt;up&lt;/span&gt;&lt;span class="err"&gt;",&lt;/span&gt; &lt;span class="na"&gt;new_user_registration_path&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;class:&lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="na"&gt;navbar-item&lt;/span&gt; &lt;span class="na"&gt;button&lt;/span&gt; &lt;span class="na"&gt;is-rounded&lt;/span&gt;&lt;span class="err"&gt;"%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt; &lt;span class="na"&gt;end&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

          &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/nav&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;yield&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;footer&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"footer"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"container"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"content has-text-centered"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;
        Visit &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://superxschool.com"&lt;/span&gt; &lt;span class="na"&gt;target=&lt;/span&gt;&lt;span class="s"&gt;"_blank"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;superxschool.com&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt; for more builds like this one.
        &lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/footer&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;

---
app/views/devise/registrations/new.html.erb
---
&lt;span class="nt"&gt;&amp;lt;h2&amp;gt;&lt;/span&gt;Sign up&lt;span class="nt"&gt;&amp;lt;/h2&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;simple_form_for&lt;/span&gt;&lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="na"&gt;resource&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;as:&lt;/span&gt; &lt;span class="na"&gt;resource_name&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;url:&lt;/span&gt; &lt;span class="na"&gt;registration_path&lt;/span&gt;&lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="na"&gt;resource_name&lt;/span&gt;&lt;span class="err"&gt;))&lt;/span&gt; &lt;span class="na"&gt;do&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt;&lt;span class="na"&gt;f&lt;/span&gt;&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;f.error_notification&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"form-inputs"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;f.input&lt;/span&gt; &lt;span class="na"&gt;:email&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;required:&lt;/span&gt; &lt;span class="na"&gt;true&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;autofocus:&lt;/span&gt; &lt;span class="na"&gt;true&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;f.input&lt;/span&gt; &lt;span class="na"&gt;:password&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;required:&lt;/span&gt; &lt;span class="na"&gt;true&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;hint:&lt;/span&gt; &lt;span class="err"&gt;("&lt;/span&gt;&lt;span class="na"&gt;#&lt;/span&gt;&lt;span class="err"&gt;{@&lt;/span&gt;&lt;span class="na"&gt;user1gth&lt;/span&gt;&lt;span class="err"&gt;}&lt;/span&gt; &lt;span class="na"&gt;characters&lt;/span&gt; &lt;span class="na"&gt;minimum&lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt; &lt;span class="na"&gt;if&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="na"&gt;user2gth&lt;/span&gt;&lt;span class="err"&gt;)&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;f.input&lt;/span&gt; &lt;span class="na"&gt;:password_confirmation&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;required:&lt;/span&gt; &lt;span class="na"&gt;true&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"form-actions"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;f.button&lt;/span&gt; &lt;span class="na"&gt;:submit&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="na"&gt;Sign&lt;/span&gt; &lt;span class="na"&gt;up&lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt; &lt;span class="na"&gt;end&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;render&lt;/span&gt; &lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="na"&gt;devise&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="na"&gt;shared&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="na"&gt;links&lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
---
&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"section"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"container"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"columns is-centered"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"column is-4"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;h2&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"title is-2"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Sign Up&lt;span class="nt"&gt;&amp;lt;/h2&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;simple_form_for&lt;/span&gt;&lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="na"&gt;resource&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;as:&lt;/span&gt; &lt;span class="na"&gt;resource_name&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;url:&lt;/span&gt; &lt;span class="na"&gt;registration_path&lt;/span&gt;&lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="na"&gt;resource_name&lt;/span&gt;&lt;span class="err"&gt;))&lt;/span&gt; &lt;span class="na"&gt;do&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt;&lt;span class="na"&gt;f&lt;/span&gt;&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;f.error_notification&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"field"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"control"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;f.input&lt;/span&gt; &lt;span class="na"&gt;:name&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;required:&lt;/span&gt; &lt;span class="na"&gt;true&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;autofocus:&lt;/span&gt; &lt;span class="na"&gt;true&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;input_html:&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt; &lt;span class="na"&gt;class:&lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="na"&gt;input&lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt; &lt;span class="err"&gt;},&lt;/span&gt; &lt;span class="na"&gt;wrapper:&lt;/span&gt; &lt;span class="na"&gt;false&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;label_html:&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt; &lt;span class="na"&gt;class:&lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt; &lt;span class="err"&gt;}&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"field"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"control"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;f.input&lt;/span&gt; &lt;span class="na"&gt;:email&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;required:&lt;/span&gt; &lt;span class="na"&gt;true&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;input_html:&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt; &lt;span class="na"&gt;class:&lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="na"&gt;input&lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt; &lt;span class="err"&gt;},&lt;/span&gt; &lt;span class="na"&gt;wrapper:&lt;/span&gt; &lt;span class="na"&gt;false&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;label_html:&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt; &lt;span class="na"&gt;class:&lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt; &lt;span class="err"&gt;}&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"field"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"control"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;f.input&lt;/span&gt; &lt;span class="na"&gt;:password&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;required:&lt;/span&gt; &lt;span class="na"&gt;true&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;input_html:&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt; &lt;span class="na"&gt;class:&lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="na"&gt;input&lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt; &lt;span class="err"&gt;},&lt;/span&gt; &lt;span class="na"&gt;wrapper:&lt;/span&gt; &lt;span class="na"&gt;false&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;label_html:&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt; &lt;span class="na"&gt;class:&lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt; &lt;span class="err"&gt;},&lt;/span&gt; &lt;span class="na"&gt;hint:&lt;/span&gt; &lt;span class="err"&gt;("&lt;/span&gt;&lt;span class="na"&gt;#&lt;/span&gt;&lt;span class="err"&gt;{@&lt;/span&gt;&lt;span class="na"&gt;user3gth&lt;/span&gt;&lt;span class="err"&gt;}&lt;/span&gt; &lt;span class="na"&gt;characters&lt;/span&gt; &lt;span class="na"&gt;minimum&lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt; &lt;span class="na"&gt;if&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="na"&gt;user4gth&lt;/span&gt;&lt;span class="err"&gt;)&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"field"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"control"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;f.input&lt;/span&gt; &lt;span class="na"&gt;:password_confirmation&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;required:&lt;/span&gt; &lt;span class="na"&gt;true&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;input_html:&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt; &lt;span class="na"&gt;class:&lt;/span&gt; &lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="na"&gt;input&lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt; &lt;span class="err"&gt;},&lt;/span&gt; &lt;span class="na"&gt;wrapper:&lt;/span&gt; &lt;span class="na"&gt;false&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;label_html:&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt; &lt;span class="na"&gt;class:&lt;/span&gt; &lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt; &lt;span class="err"&gt;}&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"field"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"control"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;f.button&lt;/span&gt; &lt;span class="na"&gt;:submit&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="na"&gt;Sign&lt;/span&gt; &lt;span class="na"&gt;up&lt;/span&gt;&lt;span class="err"&gt;",&lt;/span&gt; &lt;span class="na"&gt;class:&lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="na"&gt;button&lt;/span&gt; &lt;span class="na"&gt;is-primary&lt;/span&gt; &lt;span class="na"&gt;is-rounded&lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt; &lt;span class="na"&gt;end&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;br&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;render&lt;/span&gt; &lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="na"&gt;devise&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="na"&gt;shared&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="na"&gt;links&lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
---
app/views/devise/registrations/edit.html.erb
---
&lt;span class="nt"&gt;&amp;lt;h2&amp;gt;&lt;/span&gt;Edit &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;resource_name.to_s.humanize&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/h2&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;simple_form_for&lt;/span&gt;&lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="na"&gt;resource&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;as:&lt;/span&gt; &lt;span class="na"&gt;resource_name&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;url:&lt;/span&gt; &lt;span class="na"&gt;registration_path&lt;/span&gt;&lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="na"&gt;resource_name&lt;/span&gt;&lt;span class="err"&gt;),&lt;/span&gt; &lt;span class="na"&gt;html:&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt; &lt;span class="na"&gt;method:&lt;/span&gt; &lt;span class="na"&gt;:put&lt;/span&gt; &lt;span class="err"&gt;})&lt;/span&gt; &lt;span class="na"&gt;do&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt;&lt;span class="na"&gt;f&lt;/span&gt;&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;f.error_notification&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"form-inputs"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;f.input&lt;/span&gt; &lt;span class="na"&gt;:email&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;required:&lt;/span&gt; &lt;span class="na"&gt;true&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;autofocus:&lt;/span&gt; &lt;span class="na"&gt;true&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt; &lt;span class="na"&gt;if&lt;/span&gt; &lt;span class="na"&gt;devise_mapping.confirmable&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt; &lt;span class="err"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="na"&gt;resource.pending_reconfirmation&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Currently waiting confirmation for: &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;resource.unconfirmed_email&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt; &lt;span class="na"&gt;end&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;f.input&lt;/span&gt; &lt;span class="na"&gt;:password&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;autocomplete:&lt;/span&gt; &lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="na"&gt;off&lt;/span&gt;&lt;span class="err"&gt;",&lt;/span&gt; &lt;span class="na"&gt;hint:&lt;/span&gt; &lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="na"&gt;leave&lt;/span&gt; &lt;span class="na"&gt;it&lt;/span&gt; &lt;span class="na"&gt;blank&lt;/span&gt; &lt;span class="na"&gt;if&lt;/span&gt; &lt;span class="na"&gt;you&lt;/span&gt; &lt;span class="na"&gt;don&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="na"&gt;t&lt;/span&gt; &lt;span class="na"&gt;want&lt;/span&gt; &lt;span class="na"&gt;to&lt;/span&gt; &lt;span class="na"&gt;change&lt;/span&gt; &lt;span class="na"&gt;it&lt;/span&gt;&lt;span class="err"&gt;",&lt;/span&gt; &lt;span class="na"&gt;required:&lt;/span&gt; &lt;span class="na"&gt;false&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;f.input&lt;/span&gt; &lt;span class="na"&gt;:password_confirmation&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;required:&lt;/span&gt; &lt;span class="na"&gt;false&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;f.input&lt;/span&gt; &lt;span class="na"&gt;:current_password&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;hint:&lt;/span&gt; &lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="na"&gt;we&lt;/span&gt; &lt;span class="na"&gt;need&lt;/span&gt; &lt;span class="na"&gt;your&lt;/span&gt; &lt;span class="na"&gt;current&lt;/span&gt; &lt;span class="na"&gt;password&lt;/span&gt; &lt;span class="na"&gt;to&lt;/span&gt; &lt;span class="na"&gt;confirm&lt;/span&gt; &lt;span class="na"&gt;your&lt;/span&gt; &lt;span class="na"&gt;changes&lt;/span&gt;&lt;span class="err"&gt;",&lt;/span&gt; &lt;span class="na"&gt;required:&lt;/span&gt; &lt;span class="na"&gt;true&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"form-actions"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;f.button&lt;/span&gt; &lt;span class="na"&gt;:submit&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="na"&gt;Update&lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt; &lt;span class="na"&gt;end&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;h3&amp;gt;&lt;/span&gt;Cancel my account&lt;span class="nt"&gt;&amp;lt;/h3&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Unhappy? &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;link_to&lt;/span&gt; &lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="na"&gt;Cancel&lt;/span&gt; &lt;span class="na"&gt;my&lt;/span&gt; &lt;span class="na"&gt;account&lt;/span&gt;&lt;span class="err"&gt;",&lt;/span&gt; &lt;span class="na"&gt;registration_path&lt;/span&gt;&lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="na"&gt;resource_name&lt;/span&gt;&lt;span class="err"&gt;),&lt;/span&gt; &lt;span class="na"&gt;data:&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt; &lt;span class="na"&gt;confirm:&lt;/span&gt; &lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="na"&gt;Are&lt;/span&gt; &lt;span class="na"&gt;you&lt;/span&gt; &lt;span class="na"&gt;sure&lt;/span&gt;&lt;span class="err"&gt;?"&lt;/span&gt; &lt;span class="err"&gt;},&lt;/span&gt; &lt;span class="na"&gt;method:&lt;/span&gt; &lt;span class="na"&gt;:delete&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/p&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;link_to&lt;/span&gt; &lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="na"&gt;Back&lt;/span&gt;&lt;span class="err"&gt;",&lt;/span&gt; &lt;span class="na"&gt;:back&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
---
app/views/devise/sessions/new.html.erb
---
&lt;span class="nt"&gt;&amp;lt;h2&amp;gt;&lt;/span&gt;Log in&lt;span class="nt"&gt;&amp;lt;/h2&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;simple_form_for&lt;/span&gt;&lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="na"&gt;resource&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;as:&lt;/span&gt; &lt;span class="na"&gt;resource_name&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;url:&lt;/span&gt; &lt;span class="na"&gt;session_path&lt;/span&gt;&lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="na"&gt;resource_name&lt;/span&gt;&lt;span class="err"&gt;))&lt;/span&gt; &lt;span class="na"&gt;do&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt;&lt;span class="na"&gt;f&lt;/span&gt;&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"form-inputs"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;f.input&lt;/span&gt; &lt;span class="na"&gt;:email&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;required:&lt;/span&gt; &lt;span class="na"&gt;false&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;autofocus:&lt;/span&gt; &lt;span class="na"&gt;true&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;f.input&lt;/span&gt; &lt;span class="na"&gt;:password&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;required:&lt;/span&gt; &lt;span class="na"&gt;false&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;f.input&lt;/span&gt; &lt;span class="na"&gt;:remember_me&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;as:&lt;/span&gt; &lt;span class="na"&gt;:boolean&lt;/span&gt; &lt;span class="na"&gt;if&lt;/span&gt; &lt;span class="na"&gt;devise_mapping.rememberable&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"form-actions"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;f.button&lt;/span&gt; &lt;span class="na"&gt;:submit&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="na"&gt;Log&lt;/span&gt; &lt;span class="na"&gt;in&lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt; &lt;span class="na"&gt;end&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;render&lt;/span&gt; &lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="na"&gt;devise&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="na"&gt;shared&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="na"&gt;links&lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

---
&lt;span class="nt"&gt;&amp;lt;section&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"section"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"container"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"columns is-centered"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"column is-4"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;h2&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"title is-2"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Log in&lt;span class="nt"&gt;&amp;lt;/h2&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;simple_form_for&lt;/span&gt;&lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="na"&gt;resource&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;as:&lt;/span&gt; &lt;span class="na"&gt;resource_name&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;url:&lt;/span&gt; &lt;span class="na"&gt;session_path&lt;/span&gt;&lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="na"&gt;resource_name&lt;/span&gt;&lt;span class="err"&gt;))&lt;/span&gt; &lt;span class="na"&gt;do&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt;&lt;span class="na"&gt;f&lt;/span&gt;&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

                  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"field"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"control"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;f.input&lt;/span&gt; &lt;span class="na"&gt;:email&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;required:&lt;/span&gt; &lt;span class="na"&gt;false&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;input_html:&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt; &lt;span class="na"&gt;class:&lt;/span&gt; &lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="na"&gt;input&lt;/span&gt;&lt;span class="err"&gt;"},&lt;/span&gt; &lt;span class="na"&gt;wrapper:&lt;/span&gt; &lt;span class="na"&gt;false&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;label_html:&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt; &lt;span class="na"&gt;class:&lt;/span&gt; &lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt; &lt;span class="err"&gt;}&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
                  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

                  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"field"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"control"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;f.input&lt;/span&gt; &lt;span class="na"&gt;:password&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;required:&lt;/span&gt; &lt;span class="na"&gt;false&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;input_html:&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt; &lt;span class="na"&gt;class:&lt;/span&gt; &lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="na"&gt;input&lt;/span&gt;&lt;span class="err"&gt;"},&lt;/span&gt; &lt;span class="na"&gt;wrapper:&lt;/span&gt; &lt;span class="na"&gt;false&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;label_html:&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt; &lt;span class="na"&gt;class:&lt;/span&gt; &lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt; &lt;span class="err"&gt;}&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

                    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"field"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"control"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;f.input&lt;/span&gt; &lt;span class="na"&gt;:remember_me&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;wrapper:&lt;/span&gt; &lt;span class="na"&gt;false&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;as:&lt;/span&gt; &lt;span class="na"&gt;:boolean&lt;/span&gt; &lt;span class="na"&gt;if&lt;/span&gt; &lt;span class="na"&gt;devise_mapping.rememberable&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

                  &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;f.button&lt;/span&gt; &lt;span class="na"&gt;:submit&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="na"&gt;Log&lt;/span&gt; &lt;span class="na"&gt;in&lt;/span&gt;&lt;span class="err"&gt;",&lt;/span&gt; &lt;span class="na"&gt;class:&lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="na"&gt;button&lt;/span&gt; &lt;span class="na"&gt;is-rounded&lt;/span&gt; &lt;span class="na"&gt;is-primary&lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt; &lt;span class="na"&gt;end&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;br/&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;render&lt;/span&gt; &lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="na"&gt;devise&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="na"&gt;shared&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="na"&gt;links&lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/section&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://ws2.sinaimg.cn/large/006tKfTcly1fq8s7uwiusj31kw0g6jtu.jpg" title="" alt="image"&gt;
&lt;img src="https://ws3.sinaimg.cn/large/006tKfTcly1fq8s7q73t2j31kw0niwhf.jpg" title="" alt="image"&gt;
&lt;img src="https://ws2.sinaimg.cn/large/006tKfTcly1fq8s7k28kuj31kw0ohtbl.jpg" title="" alt="image"&gt;&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git add .
git commit -m "add welcome index &amp;amp; devise"
git push origin welcome
&lt;/code&gt;&lt;/pre&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git checkout -b cart
---
rails g migration add_card_info_to_users
---
db/migrate/20180411082034_add_card_info_to_users.rb
---
class AddCardInfoToUsers &amp;lt; ActiveRecord::Migration[5.1]
  def change
    add_column :users, :stripe_id, :string
    add_column :users, :card_brand, :string
    add_column :users, :card_last4, :string
    add_column :users, :card_exp_month, :string
    add_column :users, :card_exp_year, :string
    add_column :users, :expires_at, :datetime
  end
end
---
rake db:migrate

&lt;/code&gt;&lt;/pre&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;rails g migration add_admin_to_users admin:boolean
rake db:migrate
---
rails c
2.3.1 :001 &amp;gt; user = User.last
2.3.1 :002 &amp;gt; user.admin = true
2.3.1 :003 &amp;gt; user.save
2.3.1 :004 &amp;gt; user
2.3.1 :005 &amp;gt; exit
---
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://ws1.sinaimg.cn/large/006tKfTcgy1fq8sxoqqiyj31kw0fodkg.jpg" title="" alt="image"&gt;&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git checkout -b job-scaffold

rails g scaffold Job title:string description:text url:string job_type:string location:string job_author:string remote_ok:boolean apply_url:string
rake db:migrate

---
app/views/jobs/_form.html.erb
---
&amp;lt;%= simple_form_for(@job) do |f| %&amp;gt;
  &amp;lt;%= f.error_notification %&amp;gt;

  &amp;lt;div class="form-inputs"&amp;gt;
    &amp;lt;%= f.input :title %&amp;gt;
    &amp;lt;%= f.input :description %&amp;gt;
    &amp;lt;%= f.input :url %&amp;gt;
    &amp;lt;%= f.input :job_type %&amp;gt;
    &amp;lt;%= f.input :location %&amp;gt;
    &amp;lt;%= f.input :job_author %&amp;gt;
    &amp;lt;%= f.input :remote_ok %&amp;gt;
    &amp;lt;%= f.input :apply_url %&amp;gt;
  &amp;lt;/div&amp;gt;

  &amp;lt;div class="form-actions"&amp;gt;
    &amp;lt;%= f.button :submit %&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;% end %&amp;gt;
---
&amp;lt;%= simple_form_for @job, html: { multipart: true } do |f| %&amp;gt;
  &amp;lt;%= f.error_notification %&amp;gt;

      &amp;lt;div class="field"&amp;gt;
        &amp;lt;div class="control"&amp;gt;
        &amp;lt;%= f.input :title, required: true, input_html: { class: "input" }, wrapper: false, label_html: { class: "label" }, placeholder: "Frontend Developer" %&amp;gt;
        &amp;lt;/div&amp;gt;
      &amp;lt;/div&amp;gt;

      &amp;lt;div class="field"&amp;gt;
        &amp;lt;div class="control"&amp;gt;
          &amp;lt;%= f.input :apply_url, required: true, input_html: { class: "input" }, wrapper: false, label_html: { class: "label" }  %&amp;gt;
        &amp;lt;/div&amp;gt;
      &amp;lt;/div&amp;gt;


    &amp;lt;div class="columns"&amp;gt;
      &amp;lt;div class="field column is-4"&amp;gt;
        &amp;lt;div class="control"&amp;gt;
          &amp;lt;label class="label"&amp;gt;Job Type:&amp;lt;/label&amp;gt;
          &amp;lt;div class="control has-icons-left"&amp;gt;
            &amp;lt;span class="select"&amp;gt;
              &amp;lt;%= f.input_field :job_type, collection: Job::JOB_TYPES, prompt: "Select a job type" %&amp;gt;
            &amp;lt;/span&amp;gt;
            &amp;lt;span class="icon is-small is-left"&amp;gt;
              &amp;lt;i class="fa fa-briefcase"&amp;gt;&amp;lt;/i&amp;gt;
            &amp;lt;/span&amp;gt;
          &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
      &amp;lt;/div&amp;gt;

      &amp;lt;div class="column"&amp;gt;

        &amp;lt;div class="field"&amp;gt;
          &amp;lt;div class="control"&amp;gt;
            &amp;lt;%= f.input :location, require: true, input_html: { class: "input" }, wrapper: false, label_html: { class: "label" }, hint: 'Examples: "San Francisco, CA", "Seattle", "Anywhere"' %&amp;gt;
          &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;

        &amp;lt;div class="field"&amp;gt;
          &amp;lt;div class="control"&amp;gt;
            &amp;lt;label for="job[remote_ok]"&amp;gt;
              &amp;lt;%= f.input :remote_ok, required: false, input_html: { class: "checkbox"}, wrapper: false, label: false %&amp;gt;
              Work can be done remotely
            &amp;lt;/label&amp;gt;&amp;lt;i class="fa fa-wifi"&amp;gt;&amp;lt;/i&amp;gt;
          &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
      &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;

      &amp;lt;div class="field"&amp;gt;
        &amp;lt;div class="control"&amp;gt;
          &amp;lt;%= f.input :description, required: true, input_html: { class: "textarea" }, wrapper: false, label_html: { class: "label" } %&amp;gt;
        &amp;lt;/div&amp;gt;
      &amp;lt;/div&amp;gt;


    &amp;lt;div class="columns"&amp;gt;

      &amp;lt;div class="field column"&amp;gt;
        &amp;lt;div class="control"&amp;gt;
          &amp;lt;%= f.input :job_author, required: true, input_html: { class: "input" }, wrapper: false, label_html: { class: "label" }, label: "Company" %&amp;gt;
        &amp;lt;/div&amp;gt;
      &amp;lt;/div&amp;gt;

      &amp;lt;div class="field column"&amp;gt;
        &amp;lt;div class="control"&amp;gt;
          &amp;lt;%= f.input :url, required: true, input_html: { class: "input" }, wrapper: false, label_html: { class: "label" }, label: "Company Website", placeholder: "http://company.com" %&amp;gt;
        &amp;lt;/div&amp;gt;
      &amp;lt;/div&amp;gt;

    &amp;lt;/div&amp;gt;

    &amp;lt;div class="columns"&amp;gt;
      &amp;lt;div class="field column is-4"&amp;gt;
        &amp;lt;div class="control"&amp;gt;
          &amp;lt;label class="label"&amp;gt;Logo Image&amp;lt;/label&amp;gt;
          &amp;lt;div class="file"&amp;gt;
            &amp;lt;label class="file-label"&amp;gt;
              &amp;lt;%= f.input :avatar, as: :file, required: false, input_html: { class:"file-input job-avatar" }, label: false, wrapper: false %&amp;gt;
                &amp;lt;span class="file-cta"&amp;gt;
                  &amp;lt;span class="file-icon"&amp;gt;&amp;lt;i class="fa fa-upload"&amp;gt;&amp;lt;/i&amp;gt;&amp;lt;/span&amp;gt;
                  &amp;lt;span class="file-label"&amp;gt;Choose a file…&amp;lt;/span&amp;gt;
                &amp;lt;/span&amp;gt;
            &amp;lt;/label&amp;gt;
          &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
      &amp;lt;/div&amp;gt;
      &amp;lt;div class="column"&amp;gt;
        &amp;lt;output id="list"&amp;gt;&amp;lt;/output&amp;gt;
      &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;

    &amp;lt;hr /&amp;gt;

    &amp;lt;%#= render 'payment' %&amp;gt;

    &amp;lt;%= f.button :submit, class: "button is-primary is-large is-rounded mv4" %&amp;gt;

&amp;lt;% end %&amp;gt;

&lt;/code&gt;&lt;/pre&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;app/assets/stylesheets/_functions.scss
---
:root {
 --spacing-none: 0;
 --spacing-extra-small: .25rem;
 --spacing-small: .5rem;
 --spacing-medium: 1rem;
 --spacing-large: 2rem;
 --spacing-extra-large: 4rem;
 --spacing-extra-extra-large: 8rem;
 --spacing-extra-extra-extra-large: 16rem;
}

/* Functional Styles: http://tachyons.io/docs/ */
.pa0 { padding: var(--spacing-none); }
.pa1 { padding: var(--spacing-extra-small); }
.pa2 { padding: var(--spacing-small); }
.pa3 { padding: var(--spacing-medium); }
.pa4 { padding: var(--spacing-large); }
.pa5 { padding: var(--spacing-extra-large); }
.pa6 { padding: var(--spacing-extra-extra-large); }
.pa7 { padding: var(--spacing-extra-extra-extra-large); }

.pl0 { padding-left: var(--spacing-none); }
.pl1 { padding-left: var(--spacing-extra-small); }
.pl2 { padding-left: var(--spacing-small); }
.pl3 { padding-left: var(--spacing-medium); }
.pl4 { padding-left: var(--spacing-large); }
.pl5 { padding-left: var(--spacing-extra-large); }
.pl6 { padding-left: var(--spacing-extra-extra-large); }
.pl7 { padding-left: var(--spacing-extra-extra-extra-large); }

.pr0 { padding-right: var(--spacing-none); }
.pr1 { padding-right: var(--spacing-extra-small); }
.pr2 { padding-right: var(--spacing-small); }
.pr3 { padding-right: var(--spacing-medium); }
.pr4 { padding-right: var(--spacing-large); }
.pr5 { padding-right: var(--spacing-extra-large); }
.pr6 { padding-right: var(--spacing-extra-extra-large); }
.pr7 { padding-right: var(--spacing-extra-extra-extra-large); }

.pb0 { padding-bottom: var(--spacing-none); }
.pb1 { padding-bottom: var(--spacing-extra-small); }
.pb2 { padding-bottom: var(--spacing-small); }
.pb3 { padding-bottom: var(--spacing-medium); }
.pb4 { padding-bottom: var(--spacing-large); }
.pb5 { padding-bottom: var(--spacing-extra-large); }
.pb6 { padding-bottom: var(--spacing-extra-extra-large); }
.pb7 { padding-bottom: var(--spacing-extra-extra-extra-large); }

.pt0 { padding-top: var(--spacing-none); }
.pt1 { padding-top: var(--spacing-extra-small); }
.pt2 { padding-top: var(--spacing-small); }
.pt3 { padding-top: var(--spacing-medium); }
.pt4 { padding-top: var(--spacing-large); }
.pt5 { padding-top: var(--spacing-extra-large); }
.pt6 { padding-top: var(--spacing-extra-extra-large); }
.pt7 { padding-top: var(--spacing-extra-extra-extra-large); }

.pv0 {
 padding-top: var(--spacing-none);
 padding-bottom: var(--spacing-none);
}
.pv1 {
 padding-top: var(--spacing-extra-small);
 padding-bottom: var(--spacing-extra-small);
}
.pv2 {
 padding-top: var(--spacing-small);
 padding-bottom: var(--spacing-small);
}
.pv3 {
 padding-top: var(--spacing-medium);
 padding-bottom: var(--spacing-medium);
}
.pv4 {
 padding-top: var(--spacing-large);
 padding-bottom: var(--spacing-large);
}
.pv5 {
 padding-top: var(--spacing-extra-large);
 padding-bottom: var(--spacing-extra-large);
}
.pv6 {
 padding-top: var(--spacing-extra-extra-large);
 padding-bottom: var(--spacing-extra-extra-large);
}

.pv7 {
 padding-top: var(--spacing-extra-extra-extra-large);
 padding-bottom: var(--spacing-extra-extra-extra-large);
}

.ph0 {
 padding-left: var(--spacing-none);
 padding-right: var(--spacing-none);
}

.ph1 {
 padding-left: var(--spacing-extra-small);
 padding-right: var(--spacing-extra-small);
}

.ph2 {
 padding-left: var(--spacing-small);
 padding-right: var(--spacing-small);
}

.ph3 {
 padding-left: var(--spacing-medium);
 padding-right: var(--spacing-medium);
}

.ph4 {
 padding-left: var(--spacing-large);
 padding-right: var(--spacing-large);
}

.ph5 {
 padding-left: var(--spacing-extra-large);
 padding-right: var(--spacing-extra-large);
}

.ph6 {
 padding-left: var(--spacing-extra-extra-large);
 padding-right: var(--spacing-extra-extra-large);
}

.ph7 {
 padding-left: var(--spacing-extra-extra-extra-large);
 padding-right: var(--spacing-extra-extra-extra-large);
}
.ma0  {  margin: var(--spacing-none); }
.ma1 {  margin: var(--spacing-extra-small); }
.ma2  {  margin: var(--spacing-small); }
.ma3  {  margin: var(--spacing-medium); }
.ma4  {  margin: var(--spacing-large); }
.ma5  {  margin: var(--spacing-extra-large); }
.ma6 {  margin: var(--spacing-extra-extra-large); }
.ma7 { margin: var(--spacing-extra-extra-extra-large); }

.ml0  {  margin-left: var(--spacing-none); }
.ml1 {  margin-left: var(--spacing-extra-small); }
.ml2  {  margin-left: var(--spacing-small); }
.ml3  {  margin-left: var(--spacing-medium); }
.ml4  {  margin-left: var(--spacing-large); }
.ml5  {  margin-left: var(--spacing-extra-large); }
.ml6 {  margin-left: var(--spacing-extra-extra-large); }
.ml7 { margin-left: var(--spacing-extra-extra-extra-large); }

.mr0  {  margin-right: var(--spacing-none); }
.mr1 {  margin-right: var(--spacing-extra-small); }
.mr2  {  margin-right: var(--spacing-small); }
.mr3  {  margin-right: var(--spacing-medium); }
.mr4  {  margin-right: var(--spacing-large); }
.mr5  {  margin-right: var(--spacing-extra-large); }
.mr6 {  margin-right: var(--spacing-extra-extra-large); }
.mr7 { margin-right: var(--spacing-extra-extra-extra-large); }

.mb0  {  margin-bottom: var(--spacing-none); }
.mb1 {  margin-bottom: var(--spacing-extra-small); }
.mb2  {  margin-bottom: var(--spacing-small); }
.mb3  {  margin-bottom: var(--spacing-medium); }
.mb4  {  margin-bottom: var(--spacing-large); }
.mb5  {  margin-bottom: var(--spacing-extra-large); }
.mb6 {  margin-bottom: var(--spacing-extra-extra-large); }
.mb7 { margin-bottom: var(--spacing-extra-extra-extra-large); }

.mt0  {  margin-top: var(--spacing-none); }
.mt1 {  margin-top: var(--spacing-extra-small); }
.mt2  {  margin-top: var(--spacing-small); }
.mt3  {  margin-top: var(--spacing-medium); }
.mt4  {  margin-top: var(--spacing-large); }
.mt5  {  margin-top: var(--spacing-extra-large); }
.mt6 {  margin-top: var(--spacing-extra-extra-large); }
.mt7 { margin-top: var(--spacing-extra-extra-extra-large); }

.mv0   {
 margin-top: var(--spacing-none);
 margin-bottom: var(--spacing-none);
}
.mv1  {
 margin-top: var(--spacing-extra-small);
 margin-bottom: var(--spacing-extra-small);
}
.mv2   {
 margin-top: var(--spacing-small);
 margin-bottom: var(--spacing-small);
}
.mv3   {
 margin-top: var(--spacing-medium);
 margin-bottom: var(--spacing-medium);
}
.mv4   {
 margin-top: var(--spacing-large);
 margin-bottom: var(--spacing-large);
}
.mv5   {
 margin-top: var(--spacing-extra-large);
 margin-bottom: var(--spacing-extra-large);
}
.mv6  {
 margin-top: var(--spacing-extra-extra-large);
 margin-bottom: var(--spacing-extra-extra-large);
}
.mv7  {
 margin-top: var(--spacing-extra-extra-extra-large);
 margin-bottom: var(--spacing-extra-extra-extra-large);
}

.mh0   {
 margin-left: var(--spacing-none);
 margin-right: var(--spacing-none);
}
.mh1   {
 margin-left: var(--spacing-extra-small);
 margin-right: var(--spacing-extra-small);
}
.mh2   {
 margin-left: var(--spacing-small);
 margin-right: var(--spacing-small);
}
.mh3   {
 margin-left: var(--spacing-medium);
 margin-right: var(--spacing-medium);
}
.mh4   {
 margin-left: var(--spacing-large);
 margin-right: var(--spacing-large);
}
.mh5   {
 margin-left: var(--spacing-extra-large);
 margin-right: var(--spacing-extra-large);
}
.mh6  {
 margin-left: var(--spacing-extra-extra-large);
 margin-right: var(--spacing-extra-extra-large);
}
.mh7  {
 margin-left: var(--spacing-extra-extra-extra-large);
 margin-right: var(--spacing-extra-extra-extra-large);
}

/* Color */
.bg-gray { background-color: #f8f8f8; }

/* Font Size */
.f1 { font-size: 3rem; }
.f2 { font-size: 2.25rem; }
.f3 { font-size: 1.5rem; }
.f4 { font-size: 1.25rem; }
.f5 { font-size: 1rem; }
.f6 { font-size: .875rem; }
.f7 { font-size: .75rem; }

/* Font Weight */
.fw4 { font-weight: 400; }
.fw5 { font-weight: 500; }
.fw6 { font-weight: 600; }
.fw7 { font-weight: 600; }

.text-sans-serif { font-family: sans-serif; }
.text-serif { font-family: serif; }
.text-uppercase { text-transform: uppercase; }

/* Border */
.border-light { border: 1px solid #dddddd; }
.border { border: 1px solid #dedede; }

.border-bottom {
 border-bottom: 1px solid #dddddd;
 &amp;amp;:last-of-type {
   border-bottom: 0;
 }
}

.border-top { border-top: 1px solid #dddddd; }
.border-right { border-right: 1px solid #dddddd; }

.border-radius-3 { border-radius: 3px; }

.justify-center { justify-content: center; }
.align-items-center { align-items: center; }

/* Display */
.inline-block { display: inline-block; }
.block { display: block; }

/* Background */
.bg-white { background-color: white; }
.bg-light { background-color: whitesmoke; }
---
app/assets/stylesheets/application.scss
---
// *= require trix

@import "bulma";
@import "functions";
@import "jobs";
@import "stripe";

.notification {
  border-radius: 0;
}

.notification:not(:last-child) {
  margin-bottom: 0;
}

.hint {
  font-size: small;
}

.tag {
  text-transform: uppercase;
  font-weight: bold;
  font-size: 9px !important;
}
---
app/views/jobs/show.html.erb
---
&amp;lt;p id="notice"&amp;gt;&amp;lt;%= notice %&amp;gt;&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;
  &amp;lt;strong&amp;gt;Title:&amp;lt;/strong&amp;gt;
  &amp;lt;%= @job.title %&amp;gt;
&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;
  &amp;lt;strong&amp;gt;Description:&amp;lt;/strong&amp;gt;
  &amp;lt;%= @job.description %&amp;gt;
&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;
  &amp;lt;strong&amp;gt;Url:&amp;lt;/strong&amp;gt;
  &amp;lt;%= @job.url %&amp;gt;
&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;
  &amp;lt;strong&amp;gt;Job type:&amp;lt;/strong&amp;gt;
  &amp;lt;%= @job.job_type %&amp;gt;
&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;
  &amp;lt;strong&amp;gt;Location:&amp;lt;/strong&amp;gt;
  &amp;lt;%= @job.location %&amp;gt;
&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;
  &amp;lt;strong&amp;gt;Job author:&amp;lt;/strong&amp;gt;
  &amp;lt;%= @job.job_author %&amp;gt;
&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;
  &amp;lt;strong&amp;gt;Remote ok:&amp;lt;/strong&amp;gt;
  &amp;lt;%= @job.remote_ok %&amp;gt;
&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;
  &amp;lt;strong&amp;gt;Apply url:&amp;lt;/strong&amp;gt;
  &amp;lt;%= @job.apply_url %&amp;gt;
&amp;lt;/p&amp;gt;

&amp;lt;%= link_to 'Edit', edit_job_path(@job) %&amp;gt; |
&amp;lt;%= link_to 'Back', jobs_path %&amp;gt;
---

&amp;lt;div class="columns pt4 pb7"&amp;gt;
  &amp;lt;div class="column is-7 is-offset-1"&amp;gt;

    &amp;lt;p class="f7"&amp;gt;&amp;lt;i class="fa fa-clock"&amp;gt;&amp;lt;/i&amp;gt; Posted &amp;lt;%= time_ago_in_words(@job.created_at) %&amp;gt; ago&amp;lt;/p&amp;gt;
    &amp;lt;h1 class="title is-2"&amp;gt;&amp;lt;%= @job.title %&amp;gt;&amp;lt;/h1&amp;gt;

    &amp;lt;ul class="list pb4"&amp;gt;
      &amp;lt;li class="inline-block f6 pr2"&amp;gt;&amp;lt;%#= job_type(@job.job_type) %&amp;gt;&amp;lt;/li&amp;gt;
      &amp;lt;li class="inline-block f6 ph2"&amp;gt;&amp;lt;i class="fa fa-pin"&amp;gt;&amp;lt;/i&amp;gt; &amp;lt;%= @job.location %&amp;gt;&amp;lt;/li&amp;gt;
      &amp;lt;% if @job.remote_ok? %&amp;gt;
        &amp;lt;li class="inline-block f6 ph2"&amp;gt;&amp;lt;i class="fa fa-wifi"&amp;gt;&amp;lt;/i&amp;gt; Remote Job&amp;lt;/li&amp;gt;
      &amp;lt;% end %&amp;gt;
    &amp;lt;/ul&amp;gt;

    &amp;lt;div class="content text-serif f4"&amp;gt;
      &amp;lt;%= @job.description.html_safe %&amp;gt;
    &amp;lt;/div&amp;gt;

    &amp;lt;%= link_to 'Apply to this job', @job.apply_url, class:"button is-rounded is-large is-fullwidth is-link" %&amp;gt;

  &amp;lt;/div&amp;gt;

  &amp;lt;div class="column is-2 is-offset-1 has-text-centered"&amp;gt;

    &amp;lt;%# if !@job.avatar.file.nil? %&amp;gt;
      &amp;lt;%#= link_to image_tag(@job.avatar_url(:thumb), alt: @job.job_author, class: "has-text-centered"), @job.url %&amp;gt;
    &amp;lt;%# end %&amp;gt;

    &amp;lt;h5 class="is-5 has-text-centered"&amp;gt;&amp;lt;%= link_to @job.job_author, @job.url %&amp;gt;&amp;lt;/h5&amp;gt;

    &amp;lt;div class="mt2 mb4"&amp;gt;
    &amp;lt;%= link_to @job.url do %&amp;gt;
      &amp;lt;i class="fa fa-globe"&amp;gt;&amp;lt;/i&amp;gt;
    &amp;lt;% end %&amp;gt;
    &amp;lt;/div&amp;gt;

    &amp;lt;%= link_to 'Apply to this job', @job.apply_url, class:"button is-rounded is-fullwidth is-link" %&amp;gt;

    &amp;lt;%# if current_user.try(:admin) || job_author(@job) %&amp;gt;
      &amp;lt;ul class="pv3"&amp;gt;
        &amp;lt;li class="pv1 f6"&amp;gt;Admin controls: &amp;lt;/li&amp;gt;
        &amp;lt;li class="pv1 inline-block"&amp;gt;
          &amp;lt;%= link_to 'View', @job, class: 'button is-small is-link is-outlined' %&amp;gt;&amp;lt;/li&amp;gt;
        &amp;lt;li class="pv1 inline-block"&amp;gt;
          &amp;lt;%= link_to 'Edit', edit_job_path(@job), class: 'button is-small is-link is-outlined' %&amp;gt;&amp;lt;/li&amp;gt;
        &amp;lt;li class="pv1 inline-block"&amp;gt;
          &amp;lt;%= link_to 'Delete', @job, method: :delete, data: { confirm: 'Are you sure?' }, class: 'button is-small is-link is-outlined' %&amp;gt;&amp;lt;/li&amp;gt;
      &amp;lt;/ul&amp;gt;
    &amp;lt;%# end %&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
---
app/views/jobs/index.html.erb
---
&amp;lt;p id="notice"&amp;gt;&amp;lt;%= notice %&amp;gt;&amp;lt;/p&amp;gt;

&amp;lt;h1&amp;gt;Jobs&amp;lt;/h1&amp;gt;

&amp;lt;table&amp;gt;
  &amp;lt;thead&amp;gt;
    &amp;lt;tr&amp;gt;
      &amp;lt;th&amp;gt;Title&amp;lt;/th&amp;gt;
      &amp;lt;th&amp;gt;Description&amp;lt;/th&amp;gt;
      &amp;lt;th&amp;gt;Url&amp;lt;/th&amp;gt;
      &amp;lt;th&amp;gt;Job type&amp;lt;/th&amp;gt;
      &amp;lt;th&amp;gt;Location&amp;lt;/th&amp;gt;
      &amp;lt;th&amp;gt;Job author&amp;lt;/th&amp;gt;
      &amp;lt;th&amp;gt;Remote ok&amp;lt;/th&amp;gt;
      &amp;lt;th&amp;gt;Apply url&amp;lt;/th&amp;gt;
      &amp;lt;th colspan="3"&amp;gt;&amp;lt;/th&amp;gt;
    &amp;lt;/tr&amp;gt;
  &amp;lt;/thead&amp;gt;

  &amp;lt;tbody&amp;gt;
    &amp;lt;% @jobs.each do |job| %&amp;gt;
      &amp;lt;tr&amp;gt;
        &amp;lt;td&amp;gt;&amp;lt;%= job.title %&amp;gt;&amp;lt;/td&amp;gt;
        &amp;lt;td&amp;gt;&amp;lt;%= job.description %&amp;gt;&amp;lt;/td&amp;gt;
        &amp;lt;td&amp;gt;&amp;lt;%= job.url %&amp;gt;&amp;lt;/td&amp;gt;
        &amp;lt;td&amp;gt;&amp;lt;%= job.job_type %&amp;gt;&amp;lt;/td&amp;gt;
        &amp;lt;td&amp;gt;&amp;lt;%= job.location %&amp;gt;&amp;lt;/td&amp;gt;
        &amp;lt;td&amp;gt;&amp;lt;%= job.job_author %&amp;gt;&amp;lt;/td&amp;gt;
        &amp;lt;td&amp;gt;&amp;lt;%= job.remote_ok %&amp;gt;&amp;lt;/td&amp;gt;
        &amp;lt;td&amp;gt;&amp;lt;%= job.apply_url %&amp;gt;&amp;lt;/td&amp;gt;
        &amp;lt;td&amp;gt;&amp;lt;%= link_to 'Show', job %&amp;gt;&amp;lt;/td&amp;gt;
        &amp;lt;td&amp;gt;&amp;lt;%= link_to 'Edit', edit_job_path(job) %&amp;gt;&amp;lt;/td&amp;gt;
        &amp;lt;td&amp;gt;&amp;lt;%= link_to 'Destroy', job, method: :delete, data: { confirm: 'Are you sure?' } %&amp;gt;&amp;lt;/td&amp;gt;
      &amp;lt;/tr&amp;gt;
    &amp;lt;% end %&amp;gt;
  &amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;

&amp;lt;br&amp;gt;

&amp;lt;%= link_to 'New Job', new_job_path %&amp;gt;
---
&amp;lt;div class="columns border-top"&amp;gt;

  &amp;lt;div class="column is-2 bg-light"&amp;gt;
    &amp;lt;div class="pl3 pr1"&amp;gt;
      &amp;lt;%= render 'panel' %&amp;gt;
    &amp;lt;/div&amp;gt;
  &amp;lt;/div&amp;gt;

  &amp;lt;div class="column is-9 pl6"&amp;gt;
    &amp;lt;% @jobs.each do |job| %&amp;gt;
    &amp;lt;div class="columns border-bottom pt4"&amp;gt;
      &amp;lt;div class="column is-1"&amp;gt;
        &amp;lt;% if !job.avatar.file.nil? %&amp;gt;
          &amp;lt;%= link_to image_tag(job.avatar_url(:thumb), alt: job.job_author, width: 100, height: 100), job.url %&amp;gt;
        &amp;lt;% end %&amp;gt;
      &amp;lt;/div&amp;gt;
      &amp;lt;div class="column is-8"&amp;gt;
        &amp;lt;h3 class="title is-4 index-title"&amp;gt;&amp;lt;%= link_to job.title, job %&amp;gt;&amp;lt;/h3&amp;gt;
          &amp;lt;ul&amp;gt;
            &amp;lt;li&amp;gt;&amp;lt;%= link_to job.job_author, job.url %&amp;gt;&amp;lt;/li&amp;gt;
          &amp;lt;/ul&amp;gt;
        &amp;lt;div class="pv2 f6"&amp;gt;
          &amp;lt;%= sanitize(job.description.truncate(200, separator: '&amp;lt;/p&amp;gt;')) %&amp;gt;
        &amp;lt;/div&amp;gt;

        &amp;lt;% if current_user.try(:admin) || job_author(job) %&amp;gt;
          &amp;lt;ul class="pv3"&amp;gt;
            &amp;lt;li class="inline-block f6"&amp;gt;Admin controls: &amp;lt;/li&amp;gt;
            &amp;lt;li class="inline-block"&amp;gt;
              &amp;lt;%= link_to 'View', job, class: 'button is-small is-link is-outlined' %&amp;gt;&amp;lt;/li&amp;gt;
            &amp;lt;li class="inline-block"&amp;gt;
              &amp;lt;%= link_to 'Edit', edit_job_path(job), class: 'button is-small is-link is-outlined' %&amp;gt;&amp;lt;/li&amp;gt;
            &amp;lt;li class="inline-block"&amp;gt;
              &amp;lt;%= link_to 'Delete', job, method: :delete, data: { confirm: 'Are you sure?' }, class: 'button is-small is-link is-outlined' %&amp;gt;&amp;lt;/li&amp;gt;
          &amp;lt;/ul&amp;gt;
        &amp;lt;% end %&amp;gt;

        &amp;lt;/div&amp;gt;
        &amp;lt;div class="column has-text-right"&amp;gt;
          &amp;lt;%= job_type(job.job_type) %&amp;gt;
          &amp;lt;p class="pt2 f6"&amp;gt;&amp;lt;%= job.location %&amp;gt;&amp;lt;/p&amp;gt;
        &amp;lt;/div&amp;gt;
      &amp;lt;/div&amp;gt;
    &amp;lt;% end %&amp;gt;
  &amp;lt;/div&amp;gt;

&amp;lt;/div&amp;gt;
----
app/views/jobs/_panel.html.erb
---
&amp;lt;nav class="panel"&amp;gt;

  &amp;lt;p class="text-uppercase has-text-grey pv1 f6"&amp;gt;filter by job type&amp;lt;/h3&amp;gt;

  &amp;lt;ul class="mb3 pa0"&amp;gt;

    &amp;lt;li class="pv1"&amp;gt;
      &amp;lt;%= link_to 'All', jobs_path, class: 'button is-fullwidth is-dark' %&amp;gt;
    &amp;lt;/li&amp;gt;


    &amp;lt;li class="pv1"&amp;gt;
      &amp;lt;%= link_to 'Full-time', jobs_path(job_type: "Full-time"), class: 'button is-fullwidth is-primary' %&amp;gt;
    &amp;lt;/li&amp;gt;

    &amp;lt;li class="pv1"&amp;gt;
      &amp;lt;%= link_to 'Part-time', jobs_path(job_type: "Part-time"), class: 'button is-fullwidth is-link' %&amp;gt;
    &amp;lt;/li&amp;gt;

    &amp;lt;li class="pv1"&amp;gt;
      &amp;lt;%= link_to 'Freelance', jobs_path(job_type: "Freelance"), class: 'button is-fullwidth is-warning' %&amp;gt;
    &amp;lt;/li&amp;gt;

    &amp;lt;li class="pv1"&amp;gt;
      &amp;lt;%= link_to 'Contract', jobs_path(job_type: "Contract"), class: 'button is-fullwidth is-info' %&amp;gt;
    &amp;lt;/li&amp;gt;
  &amp;lt;/ul&amp;gt;

&amp;lt;/nav&amp;gt;
---
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://ws2.sinaimg.cn/large/006tKfTcgy1fq8tyyg0xjj31kw0mywhg.jpg" title="" alt="image"&gt;
&lt;img src="https://ws4.sinaimg.cn/large/006tKfTcgy1fq8tysspnjj31kw0l8mzq.jpg" title="" alt="image"&gt;
&lt;img src="https://ws3.sinaimg.cn/large/006tKfTcgy1fq8tynqiixj31kw0p3q77.jpg" title="" alt="image"&gt;&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git add .
git commit -m "edit job index &amp;amp; show &amp;amp; form add panel"
git push origin job-scaffold
&lt;/code&gt;&lt;/pre&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git checkout -b uploader
rails generate uploader Avatar
---
app/uploaders/avatar_uploader.rb
---
include CarrierWave::MiniMagick

version :thumb do
  process resize_to_fit: [50, 50]
end

def extension_whitelist
  %w(jpg jpeg gif png)
end

---
rails g migration add_avatar_to_jobs avatar:string
rake db:migrate
---

app/models/user.rb
---
class User &amp;lt; ApplicationRecord
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable
  has_many :jobs
end

app/models/job.rb
---
class Job &amp;lt; ApplicationRecord
  belong_to :user
  mount_uploader :avatar, AvatarUploader

  JOB_TYPES = ["Full-time", "Part-time", "Contract", "Freelance"]
end
---

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://ws1.sinaimg.cn/large/006tKfTcly1fq8vepsd8rj31fk0omdna.jpg" title="" alt="image"&gt;&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git add .
git commit -m "add uploader"
git push origin uploader
&lt;/code&gt;&lt;/pre&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git checkout -b figaro
bundle exec figaro install
rails g migration add_user_id_to_jobs user_id:integer
rake db:migrate
---
app/controllers/jobs_controller.rb
---
class JobsController &amp;lt; ApplicationController
  before_action :set_job, only: [:show, :edit, :update, :destroy]
  before_action :authenticate_user!, except: [:index, :show]

  # GET /jobs
  # GET /jobs.json
  def index
    if(params.has_key?(:job_type))
      @jobs = Job.where(job_type: params[:job_type]).order("created_at desc")
    else
      @jobs = Job.all.order("created_at desc")
    end
  end

  # GET /jobs/1
  # GET /jobs/1.json
  def show
  end

  # GET /jobs/new
  def new
    @job = current_user.jobs.build
  end

  # GET /jobs/1/edit
  def edit
  end

  # POST /jobs
  # POST /jobs.json
  def create
    @job = current_user.jobs.build(job_params)

    token = params[:stripeToken]
    job_type = params[:job_type]
    job_title = params[:title]
    card_brand = params[:user][:card_brand]
    card_exp_month = params[:user][:card_exp_month]
    card_exp_year = params[:user][:card_exp_year]
    card_last4 = params[:user][:card_last4]

    charge = Stripe::Charge.create(
      :amount =&amp;gt; 30000,
      :currency =&amp;gt; "usd",
      :description =&amp;gt; job_type,
      :statement_descriptor =&amp;gt; job_title,
      :source =&amp;gt; token,
    )
    current_user.stripe_id = charge.id
    current_user.card_brand = card_brand
    current_user.card_exp_month = card_exp_month
    current_user.card_exp_year = card_exp_year
    current_user.card_last4 = card_last4
    current_user.save!

    respond_to do |format|
      if @job.save
        format.html { redirect_to @job, notice: '🎉 Your job listing was purchased successfully!' }
        format.json { render :show, status: :created, location: @job }
      else
        format.html { render :new }
        format.json { render json: @job.errors, status: :unprocessable_entity }
      end
    end

    rescue Stripe::CardError =&amp;gt; e
      flash.alert = e.message
      render action: :new
  end

  # PATCH/PUT /jobs/1
  # PATCH/PUT /jobs/1.json
  def update
    respond_to do |format|
      if @job.update(job_params)
        format.html { redirect_to @job, notice: 'Job was successfully updated.' }
        format.json { render :show, status: :ok, location: @job }
      else
        format.html { render :edit }
        format.json { render json: @job.errors, status: :unprocessable_entity }
      end
    end
  end

  # DELETE /jobs/1
  # DELETE /jobs/1.json
  def destroy
    @job.destroy
    respond_to do |format|
      format.html { redirect_to jobs_url, notice: 'Job was successfully destroyed.' }
      format.json { head :no_content }
    end
  end

  private
    # Use callbacks to share common setup or constraints between actions.
    def set_job
      @job = Job.find(params[:id])
    end

    # Never trust parameters from the scary internet, only allow the white list through.
    def job_params
      params.require(:job).permit(:title, :description, :url, :apply_url, :job_type, :job_author, :remote_ok, :location, :avatar)
    end
end

---
app/views/jobs/new.html.erb
---
&amp;lt;h1&amp;gt;New Job&amp;lt;/h1&amp;gt;

&amp;lt;%= render 'form', job: @job %&amp;gt;

&amp;lt;%= link_to 'Back', jobs_path %&amp;gt;
---
&amp;lt;section class="section"&amp;gt;
  &amp;lt;div class="container"&amp;gt;
    &amp;lt;div class="columns"&amp;gt;
      &amp;lt;div class="column is-8 is-offset-2"&amp;gt;
        &amp;lt;h1 class="title is-3"&amp;gt;Post new Job&amp;lt;/h1&amp;gt;
        &amp;lt;%= render 'form', job: @job %&amp;gt;
      &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/section&amp;gt;
---
app/views/jobs/_payment.html.erb
---
&amp;lt;% if !@job.persisted? %&amp;gt;
  &amp;lt;h4 class="subtitle is-4"&amp;gt;Payment&amp;lt;/h4&amp;gt;

  &amp;lt;div class="notification is-light has-text-centered"&amp;gt;
    &amp;lt;i class="fa fa-credit-card"&amp;gt;&amp;lt;/i&amp;gt;
    All jobs cost &amp;lt;strong&amp;gt;$300&amp;lt;/strong&amp;gt; USD for 30 days.
    &amp;lt;span class="block mb4"&amp;gt;&amp;lt;/span&amp;gt;
  &amp;lt;/div&amp;gt;

  &amp;lt;div class="form-row"&amp;gt;
    &amp;lt;label for="card-element" class="label"&amp;gt;
      Enter credit or debit card
    &amp;lt;/label&amp;gt;

    &amp;lt;div id="card-element" class="form-control"&amp;gt;
      &amp;lt;!-- a Stripe Element will be inserted here. --&amp;gt;
    &amp;lt;/div&amp;gt;
    &amp;lt;!-- used to display Element errors --&amp;gt;
    &amp;lt;div id="card-errors" role="alert"&amp;gt;&amp;lt;/div&amp;gt;
  &amp;lt;/div&amp;gt;

  &amp;lt;% if current_user.stripe_id.present? %&amp;gt;
    &amp;lt;div class="last-card bg-light pa4 border-radius-3 mt4"&amp;gt;
      &amp;lt;h5 class="is-6 title pt2"&amp;gt;Previously used card&amp;lt;/h5&amp;gt;
      &amp;lt;table class="table is-narrow bg-light is-fullwidth"&amp;gt;
        &amp;lt;thead&amp;gt;
          &amp;lt;th&amp;gt;Card Brand&amp;lt;/th&amp;gt;
          &amp;lt;th&amp;gt;Last 4 Digits&amp;lt;/th&amp;gt;
          &amp;lt;th&amp;gt;Expiration Month&amp;lt;/th&amp;gt;
          &amp;lt;th&amp;gt;Expiration Year&amp;lt;/th&amp;gt;
        &amp;lt;/thead&amp;gt;
        &amp;lt;tr&amp;gt;
          &amp;lt;td&amp;gt;&amp;lt;%= current_user.card_brand %&amp;gt;&amp;lt;/td&amp;gt;
          &amp;lt;td&amp;gt;&amp;lt;%= current_user.card_last4 %&amp;gt;&amp;lt;/td&amp;gt;
          &amp;lt;td&amp;gt;&amp;lt;%= current_user.card_exp_month %&amp;gt;&amp;lt;/td&amp;gt;
          &amp;lt;td&amp;gt;&amp;lt;%= current_user.card_exp_year %&amp;gt;&amp;lt;/td&amp;gt;
        &amp;lt;/tr&amp;gt;
      &amp;lt;/table&amp;gt;
    &amp;lt;/div&amp;gt;
  &amp;lt;% end %&amp;gt;
&amp;lt;% end %&amp;gt;
---
config/initializers/stripe.rb
---
Rails.configuration.stripe = {
  :publishable_key =&amp;gt; ENV['stripe_publishable_key'],
  :secret_key      =&amp;gt; ENV['stripe_api_key']
}

Stripe.api_key = ENV['stripe_api_key']
---
app/helpers/jobs_helper.rb
---

module JobsHelper

  def job_type(job_type)
    if job_type == "Full-time"
      content_tag :span, "#{job_type}", class: "tag is-primary"
    elsif job_type == "Part-time"
      content_tag :span, "#{job_type}", class: "tag is-link"
    elsif job_type == "Freelance"
      content_tag :span, "#{job_type}", class: "tag is-warning"
    elsif job_type == "Contract"
      content_tag :span, "#{job_type}", class: "tag is-info"
    else
      ""
    end
  end

  def job_author(job)
    user_signed_in? &amp;amp;&amp;amp; current_user.id == job.user_id
  end
end
---
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="添加数据"&gt;添加数据&lt;/h2&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;user = User.new(
  id: 3,
  email: "xiaowei@example.com",
  password: "password",
  password_confirmation: "password"
)
user.save!

Job.create!([{
  title: "React Engineer",
  description: "Morbi leo risus, porta ac consectetur ac, vestibulum at eros. Maecenas sed diam eget risus varius blandit sit amet non magna. Aenean lacinia bibendum nulla sed consectetur. Donec sed odio dui. Venenatis dapibus posuere. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Curabitur blandit tempus porttitor. Integer posuere erat a ante venenatis dapibus posuere velit aliquet. Nullam id dolor id nibh ultricies vehicula ut id elit. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Nulla vitae elit libero, a pharetra augue. Nulla vitae elit libero, a pharetra augue. Vestibulum id ligula porta felis euismod semper. Maecenas faucibus mollis interdum. Maecenas sed diam eget risus varius blandit sit amet non magna.",
  url: "https://facebook.com",
  apply_url: "https://facebook.com/apply",
  job_type: "Full-time",
  location: "San Francisco, CA",
  job_author: "Facebook",
  user_id: user.id,
  remote_ok: false
},
{
  title: "Product Designer",
  description: "Morbi leo risus, porta ac consectetur ac, vestibulum at eros. Maecenas sed diam eget risus varius blandit sit amet non magna. Aenean lacinia bibendum nulla sed consectetur. Donec sed odio dui. Venenatis dapibus posuere. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Curabitur blandit tempus porttitor. Integer posuere erat a ante venenatis dapibus posuere velit aliquet. Nullam id dolor id nibh ultricies vehicula ut id elit. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Nulla vitae elit libero, a pharetra augue. Nulla vitae elit libero, a pharetra augue. Vestibulum id ligula porta felis euismod semper. Maecenas faucibus mollis interdum. Maecenas sed diam eget risus varius blandit sit amet non magna.",
  url: "https://slack.com",
  apply_url: "https://slack.com/apply",
  job_type: "Contract",
  location: "San Francisco, CA",
  job_author: "Slack",
  user_id: user.id,
  remote_ok: false
},
{
  title: "UI/UX Designer",
  description: "Morbi leo risus, porta ac consectetur ac, vestibulum at eros. Maecenas sed diam eget risus varius blandit sit amet non magna. Aenean lacinia bibendum nulla sed consectetur. Donec sed odio dui. Venenatis dapibus posuere. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Curabitur blandit tempus porttitor. Integer posuere erat a ante venenatis dapibus posuere velit aliquet. Nullam id dolor id nibh ultricies vehicula ut id elit. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Nulla vitae elit libero, a pharetra augue. Nulla vitae elit libero, a pharetra augue. Vestibulum id ligula porta felis euismod semper. Maecenas faucibus mollis interdum. Maecenas sed diam eget risus varius blandit sit amet non magna.",
  url: "https://trello.com",
  apply_url: "https://trello.com/apply",
  job_type: "Full-time",
  location: "Anywhere",
  job_author: "Trello",
  user_id: user.id,
  remote_ok: true
}
])
---
rake db:drop
rake db:create
rake db:migrate
rake db:seed
rails server
---
&lt;/code&gt;&lt;/pre&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;rails c
2.3.1 :001 &amp;gt; user = User.last
2.3.1 :002 &amp;gt; user.admin = ture
2.3.1 :003 &amp;gt; user.admin = true
2.3.1 :004 &amp;gt; user.save
2.3.1 :005 &amp;gt; exit
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://ws4.sinaimg.cn/large/006tKfTcgy1fq9mix268sj31kw0fmjvo.jpg" title="" alt="image"&gt;&lt;/p&gt;
&lt;h2 id="结束表现形式"&gt;结束表现形式&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://ws2.sinaimg.cn/large/006tKfTcgy1fq9mmd5ufhj31kw0mvn07.jpg" title="" alt="image"&gt;
&lt;img src="https://ws1.sinaimg.cn/large/006tKfTcgy1fq9mmaemu7j31kw0smn0v.jpg" title="" alt="image"&gt;
&lt;img src="https://ws2.sinaimg.cn/large/006tKfTcgy1fq9mm41jxuj31kw0pcmze.jpg" title="" alt="image"&gt;
&lt;img src="https://ws2.sinaimg.cn/large/006tKfTcgy1fq9mlpfkprj31kw0jxwh0.jpg" title="" alt="image"&gt;
&lt;img src="https://ws3.sinaimg.cn/large/006tKfTcgy1fq9mlj5siwj31kw0j7mzb.jpg" title="" alt="image"&gt;&lt;/p&gt;</description>
      <author>xiaoweirails</author>
      <pubDate>Thu, 12 Apr 2018 09:54:36 +0800</pubDate>
      <link>https://ruby-china.org/topics/35431</link>
      <guid>https://ruby-china.org/topics/35431</guid>
    </item>
    <item>
      <title>让我们用 Ruby on Rails 来构建 Dribbble</title>
      <description>&lt;h2 id="Let's Build: A Dribbble Clone With Ruby On Rails"&gt;Let's Build: A Dribbble Clone With Ruby On Rails&lt;/h2&gt;&lt;h2 id="最后的表现效果"&gt;最后的表现效果&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://ws1.sinaimg.cn/large/006tKfTcgy1fpx3wh2o6gj31kw0ltae8.jpg" title="" alt="image"&gt;&lt;/p&gt;
&lt;h2 id="Github Repo："&gt;Github Repo:&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://github.com/shenzhoudance/dribbble_clone" rel="nofollow" target="_blank"&gt;https://github.com/shenzhoudance/dribbble_clone&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="出现的两个问题"&gt;出现的两个问题&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://ws3.sinaimg.cn/large/006tKfTcgy1fpx3wcauxrj31kw0jrwm3.jpg" title="" alt="image"&gt;
&lt;img src="https://ws2.sinaimg.cn/large/006tKfTcgy1fpx3w77xb6j31kw0hz12m.jpg" title="" alt="image"&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;第一个问题是：图片的引入部分错误；&lt;/li&gt;
&lt;li&gt;第二个问题是：评论的用户部分错误；&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;后续需要好好思考这个地方；在处理 js 的代码的时候，
明显感觉掌握的力度不够，还需要进一步的强化才好；&lt;/p&gt;

&lt;p&gt;对于 Dribbble 的案例的思考：&lt;/p&gt;

&lt;p&gt;针对于视频的教材来看，逻辑体系相对来说比较的混乱，容易出现代码的错误。&lt;/p&gt;

&lt;p&gt;所以我们在完成这个案例的教学练习的时候，应该从这个方面来完成案例的增量的开发；&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;博客功能的开发（包括：增删改查的功能 + 评论 的功能 + 投票）
&lt;code&gt;
gem "bulma-rails", "~&amp;gt; 0.6.1"
gem 'simple_form', '~&amp;gt; 3.5'
gem 'acts_as_votable', '~&amp;gt; 0.11.1'
&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;用户功能的开发（包括：导航条的制作 + 用户页面的美化
&lt;code&gt;
gem 'devise', '~&amp;gt; 4.3'
gem 'gravatar_image_tag'
&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;图片功能的开发（包括：图片的上传和引入）
&lt;code&gt;
gem 'carrierwave', '~&amp;gt; 1.2', '&amp;gt;= 1.2.1'
gem "mini_magick"
&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="- 项目云端的部署（包括：heroku 部署 和 aliyun 部署）"&gt;- 项目云端的部署（包括：heroku 部署 和 aliyun 部署）&lt;/h2&gt;&lt;h2 id="主要完成的任务的实现："&gt;主要完成的任务的实现：&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;gem 的使用&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;gem "bulma-rails", "~&amp;gt; 0.6.1"
gem 'devise', '~&amp;gt; 4.3'
gem 'carrierwave', '~&amp;gt; 1.2', '&amp;gt;= 1.2.1'
gem 'simple_form', '~&amp;gt; 3.5'
gem "mini_magick"
gem 'impressionist', '~&amp;gt; 1.6'
gem 'jquery-rails', '~&amp;gt; 4.3', '&amp;gt;= 4.3.1'
gem 'gravatar_image_tag'
gem 'acts_as_votable', '~&amp;gt; 0.11.1'
---
group :development do
---
gem 'better_errors', '~&amp;gt; 2.4'
gem 'guard', '~&amp;gt; 2.14', '&amp;gt;= 2.14.1'
gem 'guard-livereload', '~&amp;gt; 2.5', '&amp;gt;= 2.5.2', require: false
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;功能 的架构
&lt;code&gt;
1、博客（blog）：基本的 CRUD（增删改查） + Comment（评论） + Upvote(点赞) + View（预览）
2、推特（twitter）：导航 Nav（导航） + Devise 的使用
3、达波（dribble）：图片 Image 的使用
4、装修 SCSS 的使用
&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;云端 的部署
&lt;code&gt;
1、heroku 的部署
2、aliyun 的部署
&lt;/code&gt;
&lt;a href="https://teratail.com" rel="nofollow" target="_blank"&gt;https://teratail.com&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd workspace
rails new dribbble_clone
cd dribbble_clone
atom .
rails s
http://localhost:3000/
---
git add .
git commit -m "initial commit"
git remote add origin https://github.com/shenzhoudance/dribbble_clone.git
git push -u origin master
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://i.loli.net/2018/03/31/5abef9ddcd9ad.png" title="" alt="image"&gt;&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git checkout -b gems
---
gem "bulma-rails", "~&amp;gt; 0.6.1"
gem 'devise', '~&amp;gt; 4.3'
gem 'carrierwave', '~&amp;gt; 1.2', '&amp;gt;= 1.2.1'
gem 'simple_form', '~&amp;gt; 3.5'
gem "mini_magick"
gem 'impressionist', '~&amp;gt; 1.6'
gem 'jquery-rails', '~&amp;gt; 4.3', '&amp;gt;= 4.3.1'
gem 'gravatar_image_tag'
gem 'acts_as_votable', '~&amp;gt; 0.11.1'
---
group :development do
---
gem 'better_errors', '~&amp;gt; 2.4'
gem 'guard', '~&amp;gt; 2.14', '&amp;gt;= 2.14.1'
gem 'guard-livereload', '~&amp;gt; 2.5', '&amp;gt;= 2.5.2', require: false
&lt;/code&gt;&lt;/pre&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;bundle install
guard init livereload
bundle exec guard
exit
rails generate simple_form:install
&lt;/code&gt;&lt;/pre&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;app/assets/stylesheets/application.scss
---
@import "bulma";
&lt;/code&gt;&lt;/pre&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# git checkout -b home
rails g controller home index
---
root 'home#index'
rails server
app/views/home/index.html.erb
---
&amp;lt;h1&amp;gt;欢迎来到才华横溢的世界&amp;lt;/h1&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://i.loli.net/2018/03/31/5abf02a902118.png" title="" alt="image"&gt;&lt;/p&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;# git checkout -b navbar
---
app/views/layouts/application.html.erb
---
&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;DribbbleClone&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;csrf_meta_tags&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"viewport"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"width=device-width, initial-scale=1"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;stylesheet_link_tag&lt;/span&gt;    &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="na"&gt;application&lt;/span&gt;&lt;span class="err"&gt;',&lt;/span&gt; &lt;span class="na"&gt;media:&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="na"&gt;all&lt;/span&gt;&lt;span class="err"&gt;',&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="na"&gt;data-turbolinks-track&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="na"&gt;:&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="na"&gt;reload&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;stylesheet_link_tag&lt;/span&gt; &lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="na"&gt;https:&lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="na"&gt;maxcdn.bootstrapcdn.com&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="na"&gt;font-awesome&lt;/span&gt;&lt;span class="err"&gt;/4.7.0/&lt;/span&gt;&lt;span class="na"&gt;css&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="na"&gt;font-awesome.min.css&lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;javascript_include_tag&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="na"&gt;application&lt;/span&gt;&lt;span class="err"&gt;',&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="na"&gt;data-turbolinks-track&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="na"&gt;:&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="na"&gt;reload&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt; &lt;span class="na"&gt;if&lt;/span&gt; &lt;span class="na"&gt;flash&lt;/span&gt;&lt;span class="err"&gt;[&lt;/span&gt;&lt;span class="na"&gt;:notice&lt;/span&gt;&lt;span class="err"&gt;]&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"notification is-primary global-notification"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;p&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"notice"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;notice&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt; &lt;span class="na"&gt;end&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt; &lt;span class="na"&gt;if&lt;/span&gt; &lt;span class="na"&gt;flash&lt;/span&gt;&lt;span class="err"&gt;[&lt;/span&gt;&lt;span class="na"&gt;:alert&lt;/span&gt;&lt;span class="err"&gt;]&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"notification is-danger global-notification"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;p&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"alert"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;alert&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt; &lt;span class="na"&gt;end&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
     &lt;span class="nt"&gt;&amp;lt;nav&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"navbar is-dark"&lt;/span&gt; &lt;span class="na"&gt;role=&lt;/span&gt;&lt;span class="s"&gt;"navigation"&lt;/span&gt; &lt;span class="na"&gt;aria-label=&lt;/span&gt;&lt;span class="s"&gt;"main navigation"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"navbar-brand"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;link_to&lt;/span&gt; &lt;span class="na"&gt;root_path&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;class:&lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="na"&gt;navbar-item&lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt; &lt;span class="na"&gt;do&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="nt"&gt;&amp;lt;h1&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"title is-5 has-text-white"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Dribbble Clone&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
     &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt; &lt;span class="na"&gt;end&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
     &lt;span class="nt"&gt;&amp;lt;/nav&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;yield&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
 &lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# git checkout -b devise
rails g devise:install
rails g devise:views
rails g devise User
rake db:migrate

config/routes.rb
---
Rails.application.routes.draw do
  devise_for :users, controllers: { registrations: 'registrations' }
  root 'home#index'
end
---
app/controllers/registrations_controller.rb
---
class RegistrationsController &amp;lt; Devise::RegistrationsController

 private

  def sign_up_params
    params.require(:user).permit(:name, :email, :password, :password_confirmation)
  end

  def account_update_params
    params.require(:user).permit(:name, :email, :password, :password_confirmation, :current_password)
  end

end
&lt;/code&gt;&lt;/pre&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;rails g migration AddFieldsToUsers name:string
rake db:migrate
rails server
http://localhost:3000/users/sign_up
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://i.loli.net/2018/03/31/5abf0644ec6a1.png" title="" alt="image"&gt;&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;app/views/devise/sessions/new.html.erb
---
&amp;lt;h2&amp;gt;Log in&amp;lt;/h2&amp;gt;

&amp;lt;%= simple_form_for(resource, as: resource_name, url: session_path(resource_name)) do |f| %&amp;gt;
  &amp;lt;div class="form-inputs"&amp;gt;
    &amp;lt;%= f.input :email, required: false, autofocus: true %&amp;gt;
    &amp;lt;%= f.input :password, required: false %&amp;gt;
    &amp;lt;%= f.input :remember_me, as: :boolean if devise_mapping.rememberable? %&amp;gt;
  &amp;lt;/div&amp;gt;

  &amp;lt;div class="form-actions"&amp;gt;
    &amp;lt;%= f.button :submit, "Log in" %&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;% end %&amp;gt;

&amp;lt;%= render "devise/shared/links" %&amp;gt;
---
app/views/devise/registrations/new.html.erb
---
&amp;lt;h2&amp;gt;Sign up&amp;lt;/h2&amp;gt;

&amp;lt;%= simple_form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %&amp;gt;
  &amp;lt;%= f.error_notification %&amp;gt;

  &amp;lt;div class="form-inputs"&amp;gt;
    &amp;lt;%= f.input :email, required: true, autofocus: true %&amp;gt;
    &amp;lt;%= f.input :password, required: true, hint: ("#{@minimum_password_length} characters minimum" if @minimum_password_length) %&amp;gt;
    &amp;lt;%= f.input :password_confirmation, required: true %&amp;gt;
  &amp;lt;/div&amp;gt;

  &amp;lt;div class="form-actions"&amp;gt;
    &amp;lt;%= f.button :submit, "Sign up" %&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;% end %&amp;gt;

&amp;lt;%= render "devise/shared/links" %&amp;gt;
---
&amp;lt;section class="section"&amp;gt;
  &amp;lt;div class="container"&amp;gt;
    &amp;lt;div class="columns is-centered"&amp;gt;
      &amp;lt;div class="column is-4"&amp;gt;
                &amp;lt;h2 class="title is-2"&amp;gt;Sign up&amp;lt;/h2&amp;gt;

                &amp;lt;%= simple_form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %&amp;gt;
                  &amp;lt;%= f.error_notification %&amp;gt;


                &amp;lt;div class="field"&amp;gt;
                    &amp;lt;div class="control"&amp;gt;
                        &amp;lt;%= f.input :name, required: true, autofocus: true, input_html: { class: "input"}, wrapper: false, label_html: { class: "label" } %&amp;gt;
                    &amp;lt;/div&amp;gt;
                  &amp;lt;/div&amp;gt;


          &amp;lt;div class="field"&amp;gt;
            &amp;lt;div class="control"&amp;gt;
                    &amp;lt;%= f.input :email, required: true, input_html: { class: "input"}, wrapper: false, label_html: { class: "label" } %&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;/div&amp;gt;

          &amp;lt;div class="field"&amp;gt;
            &amp;lt;div class="control"&amp;gt;
                    &amp;lt;%= f.input :password, required: true, input_html: { class: "input"}, wrapper: false, label_html: { class: "label" }, hint: ("#{@minimum_password_length} characters minimum" if @minimum_password_length) %&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;/div&amp;gt;

          &amp;lt;div class="field"&amp;gt;
            &amp;lt;div class="control"&amp;gt;
                    &amp;lt;%= f.input :password_confirmation, required: true, input_html: { class: "input"}, wrapper: false, label_html: { class: "label" } %&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;/div&amp;gt;

                &amp;lt;%= f.button :submit, "Sign up", class:"button is-primary is-medium" %&amp;gt;

                &amp;lt;% end %&amp;gt;
                &amp;lt;br /&amp;gt;
                &amp;lt;%= render "devise/shared/links" %&amp;gt;
            &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
&amp;lt;/section&amp;gt;
---
app/views/devise/registrations/edit.html.erb
---
&amp;lt;h2&amp;gt;Edit &amp;lt;%= resource_name.to_s.humanize %&amp;gt;&amp;lt;/h2&amp;gt;

&amp;lt;%= simple_form_for(resource, as: resource_name, url: registration_path(resource_name), html: { method: :put }) do |f| %&amp;gt;
  &amp;lt;%= f.error_notification %&amp;gt;

  &amp;lt;div class="form-inputs"&amp;gt;
    &amp;lt;%= f.input :email, required: true, autofocus: true %&amp;gt;

    &amp;lt;% if devise_mapping.confirmable? &amp;amp;&amp;amp; resource.pending_reconfirmation? %&amp;gt;
      &amp;lt;p&amp;gt;Currently waiting confirmation for: &amp;lt;%= resource.unconfirmed_email %&amp;gt;&amp;lt;/p&amp;gt;
    &amp;lt;% end %&amp;gt;

    &amp;lt;%= f.input :password, autocomplete: "off", hint: "leave it blank if you don't want to change it", required: false %&amp;gt;
    &amp;lt;%= f.input :password_confirmation, required: false %&amp;gt;
    &amp;lt;%= f.input :current_password, hint: "we need your current password to confirm your changes", required: true %&amp;gt;
  &amp;lt;/div&amp;gt;

  &amp;lt;div class="form-actions"&amp;gt;
    &amp;lt;%= f.button :submit, "Update" %&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;% end %&amp;gt;

&amp;lt;h3&amp;gt;Cancel my account&amp;lt;/h3&amp;gt;

&amp;lt;p&amp;gt;Unhappy? &amp;lt;%= link_to "Cancel my account", registration_path(resource_name), data: { confirm: "Are you sure?" }, method: :delete %&amp;gt;&amp;lt;/p&amp;gt;

&amp;lt;%= link_to "Back", :back %&amp;gt;
---
&amp;lt;section class="section"&amp;gt;
  &amp;lt;div class="container"&amp;gt;
    &amp;lt;div class="columns is-centered"&amp;gt;
      &amp;lt;div class="column is-4"&amp;gt;

      &amp;lt;h2 class="title is-2"&amp;gt;Edit &amp;lt;%= resource_name.to_s.humanize %&amp;gt;&amp;lt;/h2&amp;gt;
      &amp;lt;%= simple_form_for(resource, as: resource_name, url: registration_path(resource_name), html: { method: :put }) do |f| %&amp;gt;
        &amp;lt;%= f.error_notification %&amp;gt;

          &amp;lt;div class="field"&amp;gt;
            &amp;lt;div class="control"&amp;gt;
              &amp;lt;%= f.input :name, required: true, autofocus: true, input_html: { class: "input"}, wrapper: false, label_html: { class: "label" } %&amp;gt;
            &amp;lt;/div&amp;gt;
          &amp;lt;/div&amp;gt;

          &amp;lt;div class="field"&amp;gt;
            &amp;lt;div class="control"&amp;gt;
              &amp;lt;%= f.input :email, required: true, input_html: { class: "input"}, wrapper: false, label_html: { class: "label" } %&amp;gt;
            &amp;lt;/div&amp;gt;
          &amp;lt;/div&amp;gt;

          &amp;lt;div class="field"&amp;gt;
          &amp;lt;% if devise_mapping.confirmable? &amp;amp;&amp;amp; resource.pending_reconfirmation? %&amp;gt;
            &amp;lt;p&amp;gt;Currently waiting confirmation for: &amp;lt;%= resource.unconfirmed_email %&amp;gt;&amp;lt;/p&amp;gt;
          &amp;lt;% end %&amp;gt;
          &amp;lt;/div&amp;gt;

          &amp;lt;div class="field"&amp;gt;
            &amp;lt;div class="control"&amp;gt;
            &amp;lt;%= f.input :password, autocomplete: "off", hint: "leave it blank if you don't want to change it", required: false, input_html: { class: "input"}, wrapper: false, label_html: { class: "label" } %&amp;gt;
            &amp;lt;/div&amp;gt;
          &amp;lt;/div&amp;gt;

          &amp;lt;div class="field"&amp;gt;
            &amp;lt;div class="control"&amp;gt;
            &amp;lt;%= f.input :password_confirmation, required: false, input_html: { class: "input"}, wrapper: false, label_html: { class: "label" } %&amp;gt;
            &amp;lt;/div&amp;gt;
          &amp;lt;/div&amp;gt;

          &amp;lt;div class="field"&amp;gt;
            &amp;lt;div class="control"&amp;gt;
              &amp;lt;%= f.input :current_password, hint: "we need your current password to confirm your changes", required: true, input_html: { class: "input"}, wrapper: false, label_html: { class: "label" } %&amp;gt;
            &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;

        &amp;lt;%= f.button :submit, "Update", class:"button is-primary" %&amp;gt;

      &amp;lt;% end %&amp;gt;

        &amp;lt;hr /&amp;gt;
        &amp;lt;h3 class="title is-5"&amp;gt;Cancel my account&amp;lt;/h3&amp;gt;
        &amp;lt;p&amp;gt;Unhappy? &amp;lt;%= link_to "Cancel my account", registration_path(resource_name), data: { confirm: "Are you sure?" }, method: :delete %&amp;gt;&amp;lt;/p&amp;gt;

      &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/section&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://i.loli.net/2018/03/31/5abf102b12f82.png" title="" alt="image"&gt;
&lt;img src="https://i.loli.net/2018/03/31/5abf10184ab8a.png" title="" alt="image"&gt;&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# git checkout -b scaffold-shot
rails g scaffold Shot title:string description:text user_id:integer
rake db:migrate
---
app/models/shot.rb
---
class Shot &amp;lt; ApplicationRecord
  belongs_to :user
end
---
app/models/user.rb
---
has_many :shots, dependent: :destroy
---
config/routes.rb
root 'shots#index'
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://i.loli.net/2018/03/31/5abf0a2403465.png" title="" alt="image"&gt;&lt;/p&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;app/views/shots/index.html.erb
---


&lt;span class="nt"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;Shots&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;table&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;thead&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;tr&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;th&amp;gt;&lt;/span&gt;Title&lt;span class="nt"&gt;&amp;lt;/th&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;th&amp;gt;&lt;/span&gt;Description&lt;span class="nt"&gt;&amp;lt;/th&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;th&amp;gt;&lt;/span&gt;User&lt;span class="nt"&gt;&amp;lt;/th&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;th&lt;/span&gt; &lt;span class="na"&gt;colspan=&lt;/span&gt;&lt;span class="s"&gt;"3"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/th&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/tr&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/thead&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;tbody&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="na"&gt;shots.each&lt;/span&gt; &lt;span class="na"&gt;do&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt;&lt;span class="na"&gt;shot&lt;/span&gt;&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;tr&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;td&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;shot.title&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/td&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;td&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;shot.description&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/td&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;td&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;shot.user_id&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/td&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;td&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;link_to&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="na"&gt;Show&lt;/span&gt;&lt;span class="err"&gt;',&lt;/span&gt; &lt;span class="na"&gt;shot&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/td&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;td&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;link_to&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="na"&gt;Edit&lt;/span&gt;&lt;span class="err"&gt;',&lt;/span&gt; &lt;span class="na"&gt;edit_shot_path&lt;/span&gt;&lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="na"&gt;shot&lt;/span&gt;&lt;span class="err"&gt;)&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/td&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;td&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;link_to&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="na"&gt;Destroy&lt;/span&gt;&lt;span class="err"&gt;',&lt;/span&gt; &lt;span class="na"&gt;shot&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;method:&lt;/span&gt; &lt;span class="na"&gt;:delete&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;data:&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt; &lt;span class="na"&gt;confirm:&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="na"&gt;Are&lt;/span&gt; &lt;span class="na"&gt;you&lt;/span&gt; &lt;span class="na"&gt;sure&lt;/span&gt;&lt;span class="err"&gt;?'&lt;/span&gt; &lt;span class="err"&gt;}&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/td&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;/tr&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt; &lt;span class="na"&gt;end&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/tbody&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/table&amp;gt;&lt;/span&gt;
---
app/views/shots/show.html.erb
---
&lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;strong&amp;gt;&lt;/span&gt;Title:&lt;span class="nt"&gt;&amp;lt;/strong&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="na"&gt;shot.title&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;strong&amp;gt;&lt;/span&gt;Description:&lt;span class="nt"&gt;&amp;lt;/strong&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="na"&gt;shot.description&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;


&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;link_to&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="na"&gt;Edit&lt;/span&gt;&lt;span class="err"&gt;',&lt;/span&gt; &lt;span class="na"&gt;edit_shot_path&lt;/span&gt;&lt;span class="err"&gt;(@&lt;/span&gt;&lt;span class="na"&gt;shot&lt;/span&gt;&lt;span class="err"&gt;)&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt; |
&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;link_to&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="na"&gt;Back&lt;/span&gt;&lt;span class="err"&gt;',&lt;/span&gt; &lt;span class="na"&gt;shots_path&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
---
app/views/shots/_shot.json.jbuilder
---
json.extract! shot, :id, :title, :description, :created_at, :updated_at
json.url shot_url(shot, format: :json)
---
app/views/shots/_form.html.erb
---
&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;simple_form_for&lt;/span&gt;&lt;span class="err"&gt;(@&lt;/span&gt;&lt;span class="na"&gt;shot&lt;/span&gt;&lt;span class="err"&gt;)&lt;/span&gt; &lt;span class="na"&gt;do&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt;&lt;span class="na"&gt;f&lt;/span&gt;&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;f.error_notification&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"form-inputs"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;f.input&lt;/span&gt; &lt;span class="na"&gt;:title&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;f.input&lt;/span&gt; &lt;span class="na"&gt;:description&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"form-actions"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;f.button&lt;/span&gt; &lt;span class="na"&gt;:submit&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt; &lt;span class="na"&gt;end&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
---
&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;DribbbleClone&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;csrf_meta_tags&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"viewport"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"width=device-width, initial-scale=1"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;stylesheet_link_tag&lt;/span&gt;    &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="na"&gt;application&lt;/span&gt;&lt;span class="err"&gt;',&lt;/span&gt; &lt;span class="na"&gt;media:&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="na"&gt;all&lt;/span&gt;&lt;span class="err"&gt;',&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="na"&gt;data-turbolinks-track&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="na"&gt;:&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="na"&gt;reload&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;stylesheet_link_tag&lt;/span&gt; &lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="na"&gt;https:&lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="na"&gt;maxcdn.bootstrapcdn.com&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="na"&gt;font-awesome&lt;/span&gt;&lt;span class="err"&gt;/4.7.0/&lt;/span&gt;&lt;span class="na"&gt;css&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="na"&gt;font-awesome.min.css&lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;javascript_include_tag&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="na"&gt;application&lt;/span&gt;&lt;span class="err"&gt;',&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="na"&gt;data-turbolinks-track&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="na"&gt;:&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="na"&gt;reload&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt; &lt;span class="na"&gt;if&lt;/span&gt; &lt;span class="na"&gt;flash&lt;/span&gt;&lt;span class="err"&gt;[&lt;/span&gt;&lt;span class="na"&gt;:notice&lt;/span&gt;&lt;span class="err"&gt;]&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"notification is-primary global-notification"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;p&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"notice"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;notice&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt; &lt;span class="na"&gt;end&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt; &lt;span class="na"&gt;if&lt;/span&gt; &lt;span class="na"&gt;flash&lt;/span&gt;&lt;span class="err"&gt;[&lt;/span&gt;&lt;span class="na"&gt;:alert&lt;/span&gt;&lt;span class="err"&gt;]&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"notification is-danger global-notification"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;p&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"alert"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;alert&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt; &lt;span class="na"&gt;end&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
     &lt;span class="nt"&gt;&amp;lt;nav&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"navbar is-dark"&lt;/span&gt; &lt;span class="na"&gt;role=&lt;/span&gt;&lt;span class="s"&gt;"navigation"&lt;/span&gt; &lt;span class="na"&gt;aria-label=&lt;/span&gt;&lt;span class="s"&gt;"main navigation"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"navbar-brand"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;link_to&lt;/span&gt; &lt;span class="na"&gt;root_path&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;class:&lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="na"&gt;navbar-item&lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt; &lt;span class="na"&gt;do&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="nt"&gt;&amp;lt;h1&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"title is-5 has-text-white"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Dribbble Clone&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt; &lt;span class="na"&gt;end&lt;/span&gt;  &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"navbar-burger burger"&lt;/span&gt; &lt;span class="na"&gt;data-target=&lt;/span&gt;&lt;span class="s"&gt;"navbar"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

      &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"navbar"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"navbar-menu"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

        &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"navbar-start"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"navbar-item"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"field is-grouped"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
              &lt;span class="nt"&gt;&amp;lt;p&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"control"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;link_to&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="na"&gt;Shots&lt;/span&gt;&lt;span class="err"&gt;',&lt;/span&gt; &lt;span class="na"&gt;root_path&lt;/span&gt; &lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;class:&lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="na"&gt;button&lt;/span&gt; &lt;span class="na"&gt;is-dark&lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
              &lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
          &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

        &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"navbar-end"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"navbar-item"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"field is-grouped"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
              &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt; &lt;span class="na"&gt;if&lt;/span&gt; &lt;span class="na"&gt;user_signed_in&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
              &lt;span class="nt"&gt;&amp;lt;p&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"control"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;link_to&lt;/span&gt; &lt;span class="na"&gt;new_shot_path&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;class:&lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="na"&gt;button&lt;/span&gt; &lt;span class="na"&gt;is-primary&lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt;  &lt;span class="na"&gt;do&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                  &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"icon is-small"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;i&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"fa fa-upload"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/i&amp;gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
                  &lt;span class="nt"&gt;&amp;lt;span&amp;gt;&lt;/span&gt;New Shot&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt; &lt;span class="na"&gt;end&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
              &lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
              &lt;span class="nt"&gt;&amp;lt;p&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"control"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;link_to&lt;/span&gt; &lt;span class="na"&gt;current_user.name&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;edit_user_registration_path&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;class:&lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="na"&gt;button&lt;/span&gt; &lt;span class="na"&gt;is-dark&lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
              &lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
              &lt;span class="nt"&gt;&amp;lt;p&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"control"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;link_to&lt;/span&gt; &lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="na"&gt;Log&lt;/span&gt; &lt;span class="na"&gt;Out&lt;/span&gt;&lt;span class="err"&gt;",&lt;/span&gt; &lt;span class="na"&gt;destroy_user_session_path&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;method:&lt;/span&gt; &lt;span class="na"&gt;:delete&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;class:&lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="na"&gt;button&lt;/span&gt; &lt;span class="na"&gt;is-dark&lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
              &lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
              &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt; &lt;span class="na"&gt;else&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
              &lt;span class="nt"&gt;&amp;lt;p&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"control"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                 &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;link_to&lt;/span&gt; &lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="na"&gt;Sign&lt;/span&gt; &lt;span class="na"&gt;In&lt;/span&gt;&lt;span class="err"&gt;",&lt;/span&gt; &lt;span class="na"&gt;new_user_session_path&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;class:&lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="na"&gt;button&lt;/span&gt; &lt;span class="na"&gt;is-dark&lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
              &lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
              &lt;span class="nt"&gt;&amp;lt;p&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"control"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;link_to&lt;/span&gt; &lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="na"&gt;Sign&lt;/span&gt; &lt;span class="na"&gt;up&lt;/span&gt;&lt;span class="err"&gt;",&lt;/span&gt; &lt;span class="na"&gt;new_user_registration_path&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;class:&lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="na"&gt;button&lt;/span&gt; &lt;span class="na"&gt;is-dark&lt;/span&gt;&lt;span class="err"&gt;"%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
              &lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
              &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt; &lt;span class="na"&gt;end&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
          &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/nav&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;yield&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
---
app/assets/stylesheets/application.scss
---
$pink: #ea4c89;
$pink-invert: #fff;

$primary: $pink;
$primary-invert: $pink-invert;
$link: $primary;
$link-hover: darken($primary, 20%);


@import "bulma";

html, body {
 min-height: 100vh;
 background-color: #f4f4f4;
}

#drop_zone {
 position: relative;
 padding: 3rem 0;
 border: 2px dashed #ccc;
 text-align: center;
 border-radius: 6px;
 background-color: #f8f8f8;
 &lt;span class="err"&gt;&amp;amp;&lt;/span&gt;.dragging::before {
   content: "";
   position: absolute;
   left: 0; width: 100%;
   top: 0; height: 100%;
   display: flex;
   justify-content: center;
   align-items: center;
   font-size: 1.5em;
   background-color: rgba($primary, .3);
   pointer-events: none;
   z-index: 99;
 }
 &lt;span class="err"&gt;&amp;amp;&lt;/span&gt;.fire::before {
   content: "";
   position: absolute;
   left: 0; width: 100%;
   top: 0; height: 100%;
   display: flex;
   justify-content: center;
   align-items: center;
   font-size: 1.5em;
   background-color: rgba($green, .3);
   pointer-events: none;
   z-index: 99;
 }
}

.notification {
 border-radius: none;
}
.notification:not(:last-child) {
 margin-bottom: 0;
}

.visible {
 display: block !important;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://i.loli.net/2018/03/31/5abf0e98118bb.png" title="" alt="image"&gt;
&lt;img src="https://i.loli.net/2018/03/31/5abf0e883117f.png" title="" alt="image"&gt;&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# 用户名称的对应
rails c
2.3.1 :001 &amp;gt; @user = User
2.3.1 :002 &amp;gt; User.connection
2.3.1 :003 &amp;gt; @user = User
2.3.1 :004 &amp;gt; @user.last
2.3.1 :005 &amp;gt; @user.last
2.3.1 :006 &amp;gt; @user.destroy
2.3.1 :007 &amp;gt; @user.last
2.3.1 :009 &amp;gt; @user.destroy
2.3.1 :009 &amp;gt; @user.destroy
2.3.1 :010 &amp;gt; @user.destroy
2.3.1 :011 &amp;gt; exit
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://i.loli.net/2018/03/31/5abf12df61f05.png" title="" alt="image"&gt;&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git checkout -b shot-view
app/views/shots/new.html.erb
---
&amp;lt;h1&amp;gt;New Shot&amp;lt;/h1&amp;gt;

&amp;lt;%= render 'form', shot: @shot %&amp;gt;

&amp;lt;%= link_to 'Back', shots_path %&amp;gt;
---
&amp;lt;section class="section"&amp;gt;
    &amp;lt;div class="container"&amp;gt;
        &amp;lt;h1 class="title is-2 has-text-centered"&amp;gt;What are you working on?&amp;lt;/h1&amp;gt;
        &amp;lt;%= render 'form', shot: @shot %&amp;gt;
    &amp;lt;/div&amp;gt;
&amp;lt;/section&amp;gt;
---
app/views/shots/_form.html.erb
---

&amp;lt;%= simple_form_for(@shot) do |f| %&amp;gt;
  &amp;lt;%= f.error_notification %&amp;gt;

  &amp;lt;div class="form-inputs"&amp;gt;
    &amp;lt;%= f.input :title %&amp;gt;
    &amp;lt;%= f.input :description %&amp;gt;
  &amp;lt;/div&amp;gt;

  &amp;lt;div class="form-actions"&amp;gt;
    &amp;lt;%= f.button :submit %&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;% end %&amp;gt;
---
&amp;lt;%= simple_form_for @shot, html: { multipart: true }  do |f| %&amp;gt;
  &amp;lt;%= f.error_notification %&amp;gt;
  &amp;lt;div class="columns is-centered"&amp;gt;
    &amp;lt;div class="column is-half"&amp;gt;

    &amp;lt;%#unless @shot.user_shot.blank? %&amp;gt;
    &amp;lt;%#= image_tag (@shot.user_shot_url), id: "previewImage" %&amp;gt;
    &amp;lt;%# end %&amp;gt;

    &amp;lt;output id="list"&amp;gt;&amp;lt;/output&amp;gt;
    &amp;lt;div id="drop_zone"&amp;gt;Drag your shot here&amp;lt;/div&amp;gt;
    &amp;lt;br /&amp;gt;

    &amp;lt;%#= f.input :user_shot, label: false, input_html: { class: "file-input", type: "file" }, wrapper: false, label_html: { class: "file-label" } %&amp;gt;

    &amp;lt;div class="field"&amp;gt;
      &amp;lt;div class="control"&amp;gt;
        &amp;lt;%= f.input :title, label: "Title", input_html: { class: "input"}, wrapper: false, label_html: { class: "label" } %&amp;gt;
      &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;

    &amp;lt;div class="field"&amp;gt;
        &amp;lt;div class="control"&amp;gt;
        &amp;lt;%= f.input :description, input_html: { class: "textarea"}, wrapper: false, label_html: { class: "label" } %&amp;gt;
      &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;

    &amp;lt;div class="field"&amp;gt;
        &amp;lt;div class="control"&amp;gt;
        &amp;lt;%= f.button :submit, class:"button is-primary" %&amp;gt;
      &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;


&amp;lt;% end %&amp;gt;
---
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://i.loli.net/2018/03/31/5abf2013acf89.png" title="" alt="image"&gt;&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;rails g uploader Shot
rails g uplooader user_shot
rails g uploader user_shot
rails g migration add_user_shot_to_shots
rake db:migrate
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://i.loli.net/2018/03/31/5abf22cd1df24.png" title="" alt="image"&gt;&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;app/uploaders/shot_uploader.rb
---
class ShotUploader &amp;lt; CarrierWave::Uploader::Base
  # Include RMagick or MiniMagick support:
  # include CarrierWave::RMagick
   include CarrierWave::MiniMagick

  # Choose what kind of storage to use for this uploader:
  storage :file
  # storage :fog

  # Override the directory where uploaded files will be stored.
  # This is a sensible default for uploaders that are meant to be mounted:
  def store_dir
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  end
  ---
  app/uploaders/user_shot_uploader.rb
  ---
  class UserShotUploader &amp;lt; CarrierWave::Uploader::Base
    # Include RMagick or MiniMagick support:
    # include CarrierWave::RMagick
     include CarrierWave::MiniMagick

    # Choose what kind of storage to use for this uploader:
    storage :file
    # storage :fog

    # Override the directory where uploaded files will be stored.
    # This is a sensible default for uploaders that are meant to be mounted:
    def store_dir
      "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
    end

    # Provide a default URL as a default if there hasn't been a file uploaded:
    # def default_url(*args)
    #   # For Rails 3.1+ asset pipeline compatibility:
    #   # ActionController::Base.helpers.asset_path("fallback/" + [version_name, "default.png"].compact.join('_'))
    #
    #   "/images/fallback/" + [version_name, "default.png"].compact.join('_')
    # end

    # Process files as they are uploaded:
    # process scale: [200, 300]
    #
    # def scale(width, height)
    #   # do something
    # end

    # Create different versions of your uploaded files:
     version :full do
       process resize_to_fit: [800, 600]
     end

     version :thumb do
       process resize_to_fit: [400, 300]
     end

    # Add a white list of extensions which are allowed to be uploaded.
    # For images you might use something like this:
     def extension_whitelist
       %w(jpg jpeg gif png)
     end

    # Override the filename of the uploaded files:
    # Avoid using model.id or version_name here, see uploader/store.rb for details.
    # def filename
    #   "something.jpg" if original_filename
    # end
  end
  ---
  db/migrate/20180331055004_add_user_shot_to_shots.rb
  ---
  class AddUserShotToShots &amp;lt; ActiveRecord::Migration[5.1]
    def change
      add_column :shots, :user_shot, :string
    end
  end
  ---
app/models/shot.rb
---
class Shot &amp;lt; ApplicationRecord
  belongs_to :user
  mount_uploader :user_shot, UserShotUploader
end
---
app/views/shots/_form.html.erb
---
&amp;lt;output id="list"&amp;gt;&amp;lt;/output&amp;gt;
&amp;lt;div id="drop_zone"&amp;gt;Drag your shot here&amp;lt;/div&amp;gt;
&amp;lt;br /&amp;gt;

&amp;lt;%= f.input :user_shot, label: false, input_html: { class: "", type: "file" }, wrapper: false, label_html: { class: "file-label" } %&amp;gt;
---
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://i.loli.net/2018/03/31/5abf2578b31d2.png" title="" alt="image"&gt;&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;app/assets/javascripts/shots.js
---
document.addEventListener("turbolinks:load", function() {

    var Shots = {
        previewShot() {
            if (window.File &amp;amp;&amp;amp; window.FileList &amp;amp;&amp;amp; window.FileReader) {

                function handleFileSelect(evt) {
                    evt.stopPropagation();
                    evt.preventDefault();

                    let files = evt.target.files || evt.dataTransfer.files;
                    // files is a FileList of File objects. List some properties.
                    for (var i = 0, f; f = files[i]; i++) {

                        // Only process image files.
                        if (!f.type.match('image.*')) {
                            continue;
                        }
                        const reader = new FileReader();

                        // Closure to capture the file information.
                        reader.onload = (function(theFile) {
                            return function(e) {
                                // Render thumbnail.
                                let span = document.createElement('span');
                                span.innerHTML = ['&amp;lt;img class="thumb" src="', e.target.result,
                                    '" title="', escape(theFile.name), '"/&amp;gt;'
                                ].join('');
                                document.getElementById('list').insertBefore(span, null);
                            };
                        })(f);

                        // Read in the image file as a data URL.
                        reader.readAsDataURL(f);
                    }
                }

                function handleDragOver(evt) {
                    evt.stopPropagation();
                    evt.preventDefault();
                    evt.dataTransfer.dropEffect = 'copy'; // Explicitly show this is a copy.
                }

                // Setup the dnd listeners.
                // https://stackoverflow.com/questions/47515232/how-to-set-file-input-value-when-dropping-file-on-page
                const dropZone = document.getElementById('drop_zone');
                const target = document.documentElement;
                const fileInput = document.getElementById('shot_user_shot');
                const previewImage = document.getElementById('previewImage');
                const newShotForm = document.getElementById('new_shot');


                if (dropZone) {
                    dropZone.addEventListener('dragover', handleDragOver, false);
                    dropZone.addEventListener('drop', handleFileSelect, false);

                    // Drop zone classes itself
                    dropZone.addEventListener('dragover', (e) =&amp;gt; {
                        dropZone.classList.add('fire');
                    }, false);

                    dropZone.addEventListener('dragleave', (e) =&amp;gt; {
                        dropZone.classList.remove('fire');
                    }, false);

                    dropZone.addEventListener('drop', (e) =&amp;gt; {
                        e.preventDefault();
                        dropZone.classList.remove('fire');
                        fileInput.files = e.dataTransfer.files;
                        // if on shot/id/edit hide preview image on drop
                        if (previewImage) {
                            previewImage.style.display = 'none';
                        }
                        // If on shots/new hide dropzone on drop
                        if(newShotForm) {
                            dropZone.style.display = 'none';
                        }
                    }, false);

                    // Body specific
                    target.addEventListener('dragover', (e) =&amp;gt; {
                        e.preventDefault();
                        dropZone.classList.add('dragging');
                    }, false);

                    // removes dragging class to body WHEN NOT dragging
                    target.addEventListener('dragleave', (e) =&amp;gt; {
                        dropZone.classList.remove('dragging');
                        dropZone.classList.remove('fire');
                    }, false);
                }
            }
        },
        shotHover() {
            $('.shot').hover(function() {
                $(this).children('.shot-data').toggleClass('visible');
            });
        }

    };
    Shots.previewShot();
    Shots.shotHover();


});
---
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="实现突破的拖拽上传功能"&gt;实现突破的拖拽上传功能&lt;/h2&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git add .
git commit -m "add image Drag"
git push origin shot-view
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://i.loli.net/2018/03/31/5abf284fc8cc0.png" title="" alt="image"&gt;&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;app/controllers/shots_controller.rb
---
before_action :set_shot, only: [:show, :edit, :update, :destroy]
before_action :authenticate_user!, only: [:edit, :update, :destroy]

def index
   @shots = Shot.all.order('created_at DESC')
end

def new
  @shot = current_user.shots.build
end

def create
@shot = current_user.shots.build(shot_params)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://i.loli.net/2018/03/31/5abf2b89b750a.png" title="" alt="image"&gt;&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;app/views/shots/index.html.erb
---


&amp;lt;h1&amp;gt;Shots&amp;lt;/h1&amp;gt;

&amp;lt;table&amp;gt;
  &amp;lt;thead&amp;gt;
    &amp;lt;tr&amp;gt;
      &amp;lt;th&amp;gt;Title&amp;lt;/th&amp;gt;
      &amp;lt;th&amp;gt;Description&amp;lt;/th&amp;gt;
      &amp;lt;th&amp;gt;User&amp;lt;/th&amp;gt;
      &amp;lt;th colspan="3"&amp;gt;&amp;lt;/th&amp;gt;
    &amp;lt;/tr&amp;gt;
  &amp;lt;/thead&amp;gt;

  &amp;lt;tbody&amp;gt;
    &amp;lt;% @shots.each do |shot| %&amp;gt;
      &amp;lt;tr&amp;gt;
        &amp;lt;td&amp;gt;&amp;lt;%= shot.title %&amp;gt;&amp;lt;/td&amp;gt;
        &amp;lt;td&amp;gt;&amp;lt;%= shot.description %&amp;gt;&amp;lt;/td&amp;gt;
        &amp;lt;td&amp;gt;&amp;lt;%= shot.user_id %&amp;gt;&amp;lt;/td&amp;gt;
        &amp;lt;td&amp;gt;&amp;lt;%= link_to 'Show', shot %&amp;gt;&amp;lt;/td&amp;gt;
        &amp;lt;td&amp;gt;&amp;lt;%= link_to 'Edit', edit_shot_path(shot) %&amp;gt;&amp;lt;/td&amp;gt;
        &amp;lt;td&amp;gt;&amp;lt;%= link_to 'Destroy', shot, method: :delete, data: { confirm: 'Are you sure?' } %&amp;gt;&amp;lt;/td&amp;gt;
      &amp;lt;/tr&amp;gt;
    &amp;lt;% end %&amp;gt;
  &amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;

---
&amp;lt;section class="section"&amp;gt;
  &amp;lt;div class="shots"&amp;gt;
    &amp;lt;% @shots.each do |shot| %&amp;gt;
      &amp;lt;div class="shot-grid-item"&amp;gt;
        &amp;lt;div class="shot-wrapper"&amp;gt;

        &amp;lt;%#= link_to shot, class: "shot" do %&amp;gt;
          &amp;lt;%#= image_tag shot.image.thumb.url unless shot.image.blank? %&amp;gt;
          &amp;lt;div class="shot-data"&amp;gt;
            &amp;lt;h3 class="shot-title"&amp;gt;&amp;lt;%= shot.title %&amp;gt;&amp;lt;/h3&amp;gt;
            &amp;lt;div class="shot-description"&amp;gt;&amp;lt;%= truncate(shot.description, length: 60) %&amp;gt;&amp;lt;/div&amp;gt;
            &amp;lt;div class="shot-time"&amp;gt;
              &amp;lt;%= time_ago_in_words(shot.created_at) %&amp;gt;
            &amp;lt;/div&amp;gt;
          &amp;lt;/div&amp;gt;
          &amp;lt;%# end %&amp;gt;

           &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
     &amp;lt;% end %&amp;gt;
   &amp;lt;/div&amp;gt;
&amp;lt;/section&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.shot-wrapper {
    box-shadow: 0 1px 2px rgba(0, 0, 0, 0.07);
    border-radius: 2px;
    padding: 10px;
    background: white;
}
.shots {
    display: grid;
    grid-template-columns: repeat(5, 1fr);
    grid-gap: 1rem;
    @media only screen and (min-width: 1600px) {
        grid-template-columns: repeat(6, 1fr);
    }
    @media only screen and (max-width: 1300px) {
        grid-template-columns: repeat(4, 1fr);
    }
    @media only screen and (max-width: 1100px) {
        grid-template-columns: repeat(3, 1fr);
    }
    @media only screen and (max-width: 800px) {
        grid-template-columns: 1fr 1fr;
    }
    @media only screen and (max-width: 400px) {
        grid-template-columns: 1fr;
    }

}
.shot {
    position: relative;
    display: block;
    color: #333 !important;

    .shot-data {
        display: none;
        position: absolute;
        top: 0;
        right: 0;
        bottom: 0;
        left: 0;
        padding: 10px;
        background: rgba(white, .9);
        cursor: pointer;
        .shot-title {
            font-weight: bold;
        }
        .shot-description {
            font-size: .9rem;
        }
        .shot-time {
            font-size: .8rem;
            padding-top: .5rem;
        }
    }
}

.user-data {
    padding: 1rem 0 0 0;
}

.user-name {
    display: inline-block;
    position: relative;
    top: -4px;
    padding-left: 5px;
}

.user-thumb {
    display: inline-block;
    img {
        border-radius: 50%;
    }
}

.by,
.shot-time {
    display: inline-block;
    position: relative;
    top: -4px;
}

.shot-analytics {
    text-align: right;
    @media only screen and (max-width: 800px) {
        text-align: right;
        .level-item {
            display: inline-block;
            padding: 0 4px;
        }
        .level-left+.level-right {
            margin: 0;
            padding: 0;
        }
        .level-item:not(:last-child) {
            margin: 0;
        }
    }
}

.shot-analytics,
.panel.show-shot-analytics {
    font-size: .9rem;
    a,
    .icon {
        color: #aaa;
    }
    .icon:hover,
    a:hover {
        color: darken(#aaa, 25%);
    }
}

.panel.show-shot-analytics {
    a { color: #333; }
    .icon {
        padding-right: .5rem;
    }
    .likes .vote_count {
        margin-left: -4px;
    }
}


.shot-container {
    box-shadow: 0 1px 2px rgba(0, 0, 0, 0.07);
    border-radius: 2px;
    padding: 40px;
    background: white;
    @media only screen and (max-width: 800px) {
        padding: 10px;
    }
    .content,
    .comments {
        margin-top: 1rem;
        padding: 20px;
        @media only screen and (max-width: 800px) {
            padding: 0;
        }
    }
}

.shot-full {
    text-align: center;
}
---
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://i.loli.net/2018/03/31/5abf42617186d.png" title="" alt="image"&gt;&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;app/views/shots/index.html.erb
---
&amp;lt;section class="section"&amp;gt;
  &amp;lt;div class="shots"&amp;gt;
    &amp;lt;% @shots.each do |shot| %&amp;gt;
      &amp;lt;div class="shot-grid-item"&amp;gt;
        &amp;lt;div class="shot-wrapper"&amp;gt;

        &amp;lt;%#= link_to shot, class: "shot" do %&amp;gt;
          &amp;lt;%#= image_tag shot.image.thumb.url unless shot.image.blank? %&amp;gt;
          &amp;lt;div class="shot-data"&amp;gt;
            &amp;lt;h3 class="shot-title"&amp;gt;&amp;lt;%= link_to shot.title, shot %&amp;gt;&amp;lt;/h3&amp;gt;
            &amp;lt;div class="shot-description"&amp;gt;&amp;lt;%= truncate(shot.description, length: 60) %&amp;gt;&amp;lt;/div&amp;gt;
            &amp;lt;div class="shot-time"&amp;gt;
              &amp;lt;%= time_ago_in_words(shot.created_at) %&amp;gt;
            &amp;lt;/div&amp;gt;
          &amp;lt;/div&amp;gt;
          &amp;lt;%# end %&amp;gt;

          &amp;lt;nav class="level shot-analytics"&amp;gt;
            &amp;lt;div class="level-left"&amp;gt;&amp;lt;/div&amp;gt;
            &amp;lt;div class="level-right"&amp;gt;
              &amp;lt;div class="level-item views data"&amp;gt;
                &amp;lt;%= link_to shot do %&amp;gt;
                  &amp;lt;span class="icon"&amp;gt;&amp;lt;i class="fa fa-eye"&amp;gt;&amp;lt;/i&amp;gt;&amp;lt;/span&amp;gt;
                  0&amp;lt;%#= shot.impressionist_count %&amp;gt;
                &amp;lt;% end %&amp;gt;
              &amp;lt;/div&amp;gt;

              &amp;lt;div class="level-item comments data"&amp;gt;
                &amp;lt;%= link_to shot do %&amp;gt;
                  &amp;lt;span class="icon"&amp;gt;&amp;lt;i class="fa fa-comment"&amp;gt;&amp;lt;/i&amp;gt;&amp;lt;/span&amp;gt;
                   0&amp;lt;%#= shot.comments.count %&amp;gt;
                &amp;lt;% end %&amp;gt;
              &amp;lt;/div&amp;gt;

              &amp;lt;div class="level-item likes"&amp;gt;

                    &amp;lt;%= link_to "" do %&amp;gt;
                      &amp;lt;span class="icon"&amp;gt;&amp;lt;i class="fa fa-heart"&amp;gt;&amp;lt;/i&amp;gt;&amp;lt;/span&amp;gt;
                      &amp;lt;span class="vote_count"&amp;gt;&amp;lt;/span&amp;gt;
                      0
                    &amp;lt;% end %&amp;gt;
              &amp;lt;/div&amp;gt;
            &amp;lt;/div&amp;gt;
          &amp;lt;/nav&amp;gt;


          &amp;lt;div class="user-data"&amp;gt;
            &amp;lt;div class="user-thumb"&amp;gt;
              &amp;lt;%= gravatar_image_tag(shot.user.email.gsub('spam', 'mdeering'), alt: shot.user.name, gravatar: { size: 20 }); %&amp;gt;
            &amp;lt;/div&amp;gt;

            &amp;lt;div class="user-name"&amp;gt;&amp;lt;%= shot.user.name %&amp;gt;&amp;lt;/div&amp;gt;
          &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
     &amp;lt;/div&amp;gt;
     &amp;lt;% end %&amp;gt;
    &amp;lt;/div&amp;gt;
  &amp;lt;/section&amp;gt;
---
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://i.loli.net/2018/03/31/5abf4fea5b8ef.png" title="" alt="image"&gt;&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;app/views/shots/show.html.erb
---
&amp;lt;p&amp;gt;
  &amp;lt;strong&amp;gt;Title:&amp;lt;/strong&amp;gt;
  &amp;lt;%= @shot.title %&amp;gt;
&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;
  &amp;lt;strong&amp;gt;Description:&amp;lt;/strong&amp;gt;
  &amp;lt;%= @shot.description %&amp;gt;
&amp;lt;/p&amp;gt;


&amp;lt;%= link_to 'Edit', edit_shot_path(@shot) %&amp;gt; |
&amp;lt;%= link_to 'Back', shots_path %&amp;gt;
---
&amp;lt;div class="section"&amp;gt;
    &amp;lt;div class="container"&amp;gt;
        &amp;lt;h1 class="title is-3"&amp;gt;&amp;lt;%= @shot.title %&amp;gt;&amp;lt;/h1&amp;gt;
        &amp;lt;div class="columns"&amp;gt;
            &amp;lt;div class="column is-8"&amp;gt;
                &amp;lt;span class="by has-text-grey-light"&amp;gt;by&amp;lt;/span&amp;gt;
                &amp;lt;div class="user-thumb"&amp;gt;
                    &amp;lt;%= gravatar_image_tag(@shot.user.email.gsub('spam', 'mdeering'), alt: @shot.user.name, gravatar: { size: 20 }); %&amp;gt;
                &amp;lt;/div&amp;gt;
                &amp;lt;div class="user-name has-text-weight-bold"&amp;gt;&amp;lt;%= @shot.user.name %&amp;gt;&amp;lt;/div&amp;gt;
                &amp;lt;div class="shot-time"&amp;gt;&amp;lt;span class="has-text-grey-light"&amp;gt;posted&amp;lt;/span&amp;gt;&amp;lt;span class="has-text-weight-semibold"&amp;gt;
                    &amp;lt;%= verbose_date(@shot.created_at) %&amp;gt;
                &amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;
       &amp;lt;/div&amp;gt;
      &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;app/helpers/application_helper.rb
---
module ApplicationHelper
    def verbose_date(date)
        date.strftime('%B %d %Y')
    end
end
---
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://ws4.sinaimg.cn/large/006tNc79gy1fpw4giqt7dj31kw0cewgs.jpg" title="" alt="image"&gt;&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;app/views/shots/show.html.erb
---
&amp;lt;div class="section"&amp;gt;
    &amp;lt;div class="container"&amp;gt;
        &amp;lt;h1 class="title is-3"&amp;gt;&amp;lt;%= @shot.title %&amp;gt;&amp;lt;/h1&amp;gt;
        &amp;lt;div class="columns"&amp;gt;
            &amp;lt;div class="column is-8"&amp;gt;
                &amp;lt;span class="by has-text-grey-light"&amp;gt;by&amp;lt;/span&amp;gt;
                &amp;lt;div class="user-thumb"&amp;gt;
                    &amp;lt;%= gravatar_image_tag(@shot.user.email.gsub('spam', 'mdeering'), alt: @shot.user.name, gravatar: { size: 20 }); %&amp;gt;
                &amp;lt;/div&amp;gt;
                &amp;lt;div class="user-name has-text-weight-bold"&amp;gt;&amp;lt;%= @shot.user.name %&amp;gt;&amp;lt;/div&amp;gt;
                &amp;lt;div class="shot-time"&amp;gt;&amp;lt;span class="has-text-grey-light"&amp;gt;posted&amp;lt;/span&amp;gt;&amp;lt;span class="has-text-weight-semibold"&amp;gt;
                    &amp;lt;%= verbose_date(@shot.created_at) %&amp;gt;
                &amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;
       &amp;lt;/div&amp;gt;
      &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;

&amp;lt;div class="columns"&amp;gt;
            &amp;lt;div class="column is-8"&amp;gt;
                &amp;lt;div class="shot-container"&amp;gt;
                    &amp;lt;div class="shot-full"&amp;gt;
                         &amp;lt;%#= image_tag @shot.user_shot_url unless @shot.user_shot.blank? %&amp;gt;
                    &amp;lt;/div&amp;gt;

                    &amp;lt;% if user_signed_in? &amp;amp;&amp;amp; (current_user.id == @shot.user_id) %&amp;gt;
                        &amp;lt;div class="buttons has-addons"&amp;gt;
                            &amp;lt;%= link_to 'Edit', edit_shot_path(@shot), class: "button" %&amp;gt;
                            &amp;lt;%= link_to 'Delete', shot_path, class: "button", method: :delete, data: { confirm: 'Are you sure you want to delete this shot?'} %&amp;gt;
                        &amp;lt;/div&amp;gt;
                    &amp;lt;% end %&amp;gt;

                    &amp;lt;div class="content"&amp;gt;
                        &amp;lt;%= @shot.description %&amp;gt;
                    &amp;lt;/div&amp;gt;

          &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;


        &amp;lt;div class="column is-3 is-offset-1"&amp;gt;
                &amp;lt;div class="nav panel show-shot-analytics"&amp;gt;
                    &amp;lt;div class="panel-block views data"&amp;gt;
                        &amp;lt;span class="icon"&amp;gt;&amp;lt;i class="fa fa-eye"&amp;gt;&amp;lt;/i&amp;gt;&amp;lt;/span&amp;gt;
                        0&amp;lt;%#= pluralize(@shot.impressionist_count, 'View') %&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;div class="panel-block comments data"&amp;gt;
                        &amp;lt;span class="icon"&amp;gt;&amp;lt;i class="fa fa-comment"&amp;gt;&amp;lt;/i&amp;gt;&amp;lt;/span&amp;gt;
                        0&amp;lt;%#= pluralize(@shot.comments.count, 'Comment') %&amp;gt;
                    &amp;lt;/div&amp;gt;

                    &amp;lt;div class="panel-block likes data"&amp;gt;
                    &amp;lt;span class="icon"&amp;gt;&amp;lt;i class="fa fa-heart has-text-primary"&amp;gt;&amp;lt;/i&amp;gt;&amp;lt;/span&amp;gt;
                  0
                    &amp;lt;/div&amp;gt;

                &amp;lt;/div&amp;gt;
            &amp;lt;/div&amp;gt;
      &amp;lt;/div&amp;gt;
---
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://ws1.sinaimg.cn/large/006tNc79gy1fpw505p291j31kw0hgn14.jpg" title="" alt="image"&gt;
&lt;img src="https://ws2.sinaimg.cn/large/006tNc79gy1fpw50nfflcj31kw0pqtc6.jpg" title="" alt="image"&gt;&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git checkout -b comment
rails g controller comments
---
config/routes.rb
---
Rails.application.routes.draw do
  resources :shots do
    resources :comments
  end
  devise_for :users, controllers: { registrations: 'registrations' }
  root 'shots#index'
end
---
rails g model Comment name:string response:text
rake db:migrate
rails g migrate AddShotIdToComments
db/migrate/20180401021635_add_shot_id_to_comments.rb
---
class AddShotIdToComments &amp;lt; ActiveRecord::Migration[5.1]
  def change
    add_column :comments, :shot_id, :integer
  end
end
---
rake db:migrate
---
app/models/comment.rb
---
class Comment &amp;lt; ApplicationRecord
    belongs_to :shot
    belongs_to :user
end
---
app/models/user.rb
---
class User &amp;lt; ApplicationRecord
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

  has_many :shots, dependent: :destroy
  has_many :comments, dependent: :destroy
end
---
app/models/shot.rb
---
class Shot &amp;lt; ApplicationRecord
  belongs_to :user
  has_many :comments, dependent: :destroy
  mount_uploader :user_shot, UserShotUploader
end
---

app/controllers/comments_controller.rb
---
class CommentsController &amp;lt; ApplicationController
    before_action :authenticate_user!, only: [:create, :destroy]

  def create
    @shot = Shot.find(params[:shot_id]) # finds the shot with the associated shot_id
    @comment = @shot.comments.create(comment_params) # creates the comment on the shot passing in params
    @comment.user_id = current_user.id if current_user # assigns logged in user's ID to comment
    @comment.save!

    redirect_to shot_path(@shot)

  end

  def destroy
    @shot = Shot.find(params[:shot_id])
    @comment = @shot.comments.find(params[:id])
    @comment.destroy
    redirect_to shot_path(@shot)
  end

  private

  def comment_params
    params.require(:comment).permit(:name, :response)
  end
end
---
app/views/comments/_form.html.erb
---
&amp;lt;%= simple_form_for([@shot, @shot.comments.build]) do |f| %&amp;gt;

    &amp;lt;div class="field"&amp;gt;
        &amp;lt;div class="control"&amp;gt;
            &amp;lt;%= f.input :name, input_html: { class: 'input'}, wrapper: false, label_html: { class: 'label' } %&amp;gt;
        &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;

    &amp;lt;div class="field"&amp;gt;
        &amp;lt;div class="control"&amp;gt;
            &amp;lt;%= f.input :response, input_html: { class: 'textarea' }, wrapper: false, label_html: { class: 'label' } %&amp;gt;
        &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;

    &amp;lt;%= f.button :submit, 'Leave a reply', class: 'button is-primary' %&amp;gt;
&amp;lt;% end %&amp;gt;
---
app/views/shots/show.html.erb
---
&amp;lt;section class="comments"&amp;gt;
  &amp;lt;h2 class="subtitle is-5"&amp;gt;&amp;lt;%= pluralize(@shot.comments.count, 'Comment') %&amp;gt;&amp;lt;/h2&amp;gt;
  &amp;lt;%= render @shot.comments %&amp;gt;
  &amp;lt;hr /&amp;gt;
  &amp;lt;% if user_signed_in? %&amp;gt;
&amp;lt;div class="comment-form"&amp;gt;
  &amp;lt;h3 class="subtitle is-3"&amp;gt;Leave a reply&amp;lt;/h3&amp;gt;
  &amp;lt;%= render 'comments/form' %&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;% else %&amp;gt;
&amp;lt;div class="content"&amp;gt;&amp;lt;%= link_to 'Sign in', new_user_session_path %&amp;gt; to leave a comment.&amp;lt;/div&amp;gt;
&amp;lt;% end %&amp;gt;
&amp;lt;/section&amp;gt;
---
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://ws4.sinaimg.cn/large/006tNc79gy1fpwyg3ict1j31kw0t813b.jpg" title="" alt="image"&gt;&lt;/p&gt;
&lt;h2 id="最后效果"&gt;最后效果&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://ws3.sinaimg.cn/large/006tNc79gy1fpwyj2fqsvj31kw0ritc3.jpg" title="" alt="image"&gt;
&lt;img src="https://ws4.sinaimg.cn/large/006tNc79gy1fpwyi0nosdj31kw0jp77z.jpg" title="" alt="image"&gt;
&lt;img src="https://ws1.sinaimg.cn/large/006tNc79gy1fpwyhvdtwrj31kw0lqn0c.jpg" title="" alt="image"&gt;
&lt;img src="https://ws2.sinaimg.cn/large/006tNc79gy1fpwyhq3d36j31kw0nraca.jpg" title="" alt="image"&gt;&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git checkout -b impression1
rails g impressionist
db/migrate/20180401041606_create_impressions_table.rb
---
class CreateImpressionsTable &amp;lt; ActiveRecord::Migration[5.1]
---
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://ws3.sinaimg.cn/large/006tKfTcgy1fpx1c8qlybj31kw0irdm8.jpg" title="" alt="image"&gt;&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;app/models/shot.rb
---
class Shot &amp;lt; ApplicationRecord
  belongs_to :user
  has_many :comments, dependent: :destroy
  mount_uploader :user_shot, UserShotUploader
  is_impressionable
end
---
app/controllers/shots_controller.rb
---
before_action :set_shot, only: [:show, :edit, :update, :destroy]
before_action :authenticate_user!, only: [:edit, :update, :destroy,]
impressionist actions: [:show], unique: [:impressionable_type, :impressionable_id, :session_hash]

app/views/shots/index.html.erb
---
&amp;lt;section class="section"&amp;gt;
  &amp;lt;div class="shots"&amp;gt;
    &amp;lt;% @shots.each do |shot| %&amp;gt;
      &amp;lt;div class="shot-grid-item"&amp;gt;
        &amp;lt;div class="shot-wrapper"&amp;gt;

        &amp;lt;%#= link_to shot, class: "shot" do %&amp;gt;
           &amp;lt;%#= image_tag @shot.user_shot_url unless @shot.user_shot.blank? %&amp;gt;
          &amp;lt;div class="shot-data"&amp;gt;
            &amp;lt;h3 class="shot-title"&amp;gt;&amp;lt;%= link_to shot.title, shot %&amp;gt;&amp;lt;/h3&amp;gt;
            &amp;lt;div class="shot-description"&amp;gt;&amp;lt;%= truncate(shot.description, length: 60) %&amp;gt;&amp;lt;/div&amp;gt;
            &amp;lt;div class="shot-time"&amp;gt;
              &amp;lt;%= time_ago_in_words(shot.created_at) %&amp;gt;
            &amp;lt;/div&amp;gt;
          &amp;lt;/div&amp;gt;
          &amp;lt;%# end %&amp;gt;

          &amp;lt;nav class="level shot-analytics"&amp;gt;
            &amp;lt;div class="level-left"&amp;gt;&amp;lt;/div&amp;gt;
            &amp;lt;div class="level-right"&amp;gt;
              &amp;lt;div class="level-item views data"&amp;gt;
                &amp;lt;%= link_to shot do %&amp;gt;
                  &amp;lt;span class="icon"&amp;gt;&amp;lt;i class="fa fa-eye"&amp;gt;&amp;lt;/i&amp;gt;&amp;lt;/span&amp;gt;
                  &amp;lt;%= shot.impressionist_count %&amp;gt;
                &amp;lt;% end %&amp;gt;
              &amp;lt;/div&amp;gt;

              &amp;lt;div class="level-item comments data"&amp;gt;
                &amp;lt;%= link_to shot do %&amp;gt;
                  &amp;lt;span class="icon"&amp;gt;&amp;lt;i class="fa fa-comment"&amp;gt;&amp;lt;/i&amp;gt;&amp;lt;/span&amp;gt;
                   &amp;lt;%= shot.comments.count %&amp;gt;
                &amp;lt;% end %&amp;gt;
              &amp;lt;/div&amp;gt;

              &amp;lt;div class="level-item likes"&amp;gt;

                    &amp;lt;%= link_to "" do %&amp;gt;
                      &amp;lt;span class="icon"&amp;gt;&amp;lt;i class="fa fa-heart"&amp;gt;&amp;lt;/i&amp;gt;&amp;lt;/span&amp;gt;
                      &amp;lt;span class="vote_count"&amp;gt;&amp;lt;/span&amp;gt;
                      0
                    &amp;lt;% end %&amp;gt;
              &amp;lt;/div&amp;gt;
            &amp;lt;/div&amp;gt;
          &amp;lt;/nav&amp;gt;


          &amp;lt;div class="user-data"&amp;gt;
            &amp;lt;div class="user-thumb"&amp;gt;
              &amp;lt;%= gravatar_image_tag(shot.user.email.gsub('spam', 'mdeering'), alt: shot.user.name, gravatar: { size: 20 }); %&amp;gt;
            &amp;lt;/div&amp;gt;

            &amp;lt;div class="user-name"&amp;gt;&amp;lt;%= shot.user.name %&amp;gt;&amp;lt;/div&amp;gt;
          &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
     &amp;lt;/div&amp;gt;
     &amp;lt;% end %&amp;gt;
    &amp;lt;/div&amp;gt;
  &amp;lt;/section&amp;gt;
---
app/views/shots/show.html.erb
---
&amp;lt;div class="section"&amp;gt;
    &amp;lt;div class="container"&amp;gt;
        &amp;lt;h1 class="title is-3"&amp;gt;&amp;lt;%= @shot.title %&amp;gt;&amp;lt;/h1&amp;gt;
        &amp;lt;div class="columns"&amp;gt;
            &amp;lt;div class="column is-8"&amp;gt;
                &amp;lt;span class="by has-text-grey-light"&amp;gt;by&amp;lt;/span&amp;gt;
                &amp;lt;div class="user-thumb"&amp;gt;
                    &amp;lt;%= gravatar_image_tag(@shot.user.email.gsub('spam', 'mdeering'), alt: @shot.user.name, gravatar: { size: 20 }); %&amp;gt;
                &amp;lt;/div&amp;gt;
                &amp;lt;div class="user-name has-text-weight-bold"&amp;gt;&amp;lt;%= @shot.user.name %&amp;gt;&amp;lt;/div&amp;gt;
                &amp;lt;div class="shot-time"&amp;gt;&amp;lt;span class="has-text-grey-light"&amp;gt;posted&amp;lt;/span&amp;gt;&amp;lt;span class="has-text-weight-semibold"&amp;gt;
                    &amp;lt;%= verbose_date(@shot.created_at) %&amp;gt;
                &amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;
       &amp;lt;/div&amp;gt;
      &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;

&amp;lt;div class="columns"&amp;gt;
            &amp;lt;div class="column is-8"&amp;gt;
                &amp;lt;div class="shot-container"&amp;gt;
                    &amp;lt;div class="shot-full"&amp;gt;
                         &amp;lt;%= image_tag @shot.user_shot_url unless @shot.user_shot.blank? %&amp;gt;
                    &amp;lt;/div&amp;gt;

                    &amp;lt;% if user_signed_in? &amp;amp;&amp;amp; (current_user.id == @shot.user_id) %&amp;gt;
                        &amp;lt;div class="buttons has-addons"&amp;gt;
                            &amp;lt;%= link_to 'Edit', edit_shot_path(@shot), class: "button" %&amp;gt;
                            &amp;lt;%= link_to 'Delete', shot_path, class: "button", method: :delete, data: { confirm: 'Are you sure you want to delete this shot?'} %&amp;gt;
                        &amp;lt;/div&amp;gt;
                    &amp;lt;% end %&amp;gt;

                    &amp;lt;div class="content"&amp;gt;
                        &amp;lt;%= @shot.description %&amp;gt;
                    &amp;lt;/div&amp;gt;

                    &amp;lt;section class="comments"&amp;gt;
                    &amp;lt;h2 class="subtitle is-5"&amp;gt;&amp;lt;%= pluralize(@shot.comments.count, 'Comment') %&amp;gt;&amp;lt;/h2&amp;gt;
                      &amp;lt;%= render @shot.comments %&amp;gt;
                    &amp;lt;hr /&amp;gt;
                    &amp;lt;% if user_signed_in? %&amp;gt;
                    &amp;lt;div class="comment-form"&amp;gt;
                        &amp;lt;h3 class="subtitle is-3"&amp;gt;Leave a reply&amp;lt;/h3&amp;gt;
                        &amp;lt;%= render 'comments/form' %&amp;gt;
                    &amp;lt;/div&amp;gt;
                &amp;lt;% else %&amp;gt;
                    &amp;lt;div class="content"&amp;gt;&amp;lt;%= link_to 'Sign in', new_user_session_path %&amp;gt; to leave a comment.&amp;lt;/div&amp;gt;
                &amp;lt;% end %&amp;gt;
       &amp;lt;/section&amp;gt;

          &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;


        &amp;lt;div class="column is-3 is-offset-1"&amp;gt;
                &amp;lt;div class="nav panel show-shot-analytics"&amp;gt;
                    &amp;lt;div class="panel-block views data"&amp;gt;
                        &amp;lt;span class="icon"&amp;gt;&amp;lt;i class="fa fa-eye"&amp;gt;&amp;lt;/i&amp;gt;&amp;lt;/span&amp;gt;
                        &amp;lt;%= pluralize(@shot.impressionist_count, 'View') %&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;div class="panel-block comments data"&amp;gt;
                        &amp;lt;span class="icon"&amp;gt;&amp;lt;i class="fa fa-comment"&amp;gt;&amp;lt;/i&amp;gt;&amp;lt;/span&amp;gt;
                        &amp;lt;%= pluralize(@shot.comments.count, 'Comment') %&amp;gt;
                    &amp;lt;/div&amp;gt;

                    &amp;lt;div class="panel-block likes data"&amp;gt;
                    &amp;lt;span class="icon"&amp;gt;&amp;lt;i class="fa fa-heart has-text-primary"&amp;gt;&amp;lt;/i&amp;gt;&amp;lt;/span&amp;gt;
                  0
                    &amp;lt;/div&amp;gt;

                &amp;lt;/div&amp;gt;
            &amp;lt;/div&amp;gt;
      &amp;lt;/div&amp;gt;

---
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://ws2.sinaimg.cn/large/006tKfTcgy1fpx21sllivj31kw0eadj2.jpg" title="" alt="image"&gt;
&lt;img src="https://ws3.sinaimg.cn/large/006tKfTcgy1fpx21lcq7oj31kw0p0jul.jpg" title="" alt="image"&gt;&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git status
git add .
git commit -m "add impression views eyes"
git push origin impression1
&lt;/code&gt;&lt;/pre&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git checkout -b acts_as_votable
rails generate acts_as_votable:migration
rake db:migrate
---
app/models/shot.rb
---
class Shot &amp;lt; ApplicationRecord
  belongs_to :user
  has_many :comments, dependent: :destroy
  mount_uploader :user_shot, UserShotUploader
  is_impressionable
  acts_as_votable
end
---
app/models/user.rb
---
class User &amp;lt; ApplicationRecord
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable
  has_many :shots, dependent: :destroy
  has_many :comments, dependent: :destroy
  acts_as_voter
end
---

app/controllers/shots_controller.rb
---
before_action :set_shot, only: [:show, :edit, :update, :destroy, :like, :unlike]
before_action :authenticate_user!, only: [:edit, :update, :destroy, :like, :unlike]
impressionist actions: [:show], unique: [:impressionable_type, :impressionable_id, :session_hash]

def like
  @shot.liked_by current_user
  respond_to do |format|
    format.html { redirect_back fallback_location: root_path }
    format.json { render layout:false }
  end
end

def unlike
  @shot.unliked_by current_user
  respond_to do |format|
    format.html { redirect_back fallback_location: root_path }
    format.json { render layout:false }
  end
end
---
app/views/shots/index.html.erb
---
&amp;lt;div class="level-item likes"&amp;gt;
   &amp;lt;% if user_signed_in? %&amp;gt;

     &amp;lt;% if current_user.liked? shot %&amp;gt;
       &amp;lt;%= link_to unlike_shot_path(shot), method: :put, class: "unlike_shot" do %&amp;gt;
         &amp;lt;span class="icon"&amp;gt;&amp;lt;i class="fa fa-heart has-text-primary"&amp;gt;&amp;lt;/i&amp;gt;&amp;lt;/span&amp;gt;
         &amp;lt;span class="vote_count"&amp;gt;&amp;lt;%= shot.get_likes.size %&amp;gt;&amp;lt;/span&amp;gt;
       &amp;lt;% end %&amp;gt;
     &amp;lt;% else %&amp;gt;
       &amp;lt;%= link_to like_shot_path(shot), method: :put, class: "like_shot" do %&amp;gt;
         &amp;lt;span class="icon"&amp;gt;&amp;lt;i class="fa fa-heart"&amp;gt;&amp;lt;/i&amp;gt;&amp;lt;/span&amp;gt;
         &amp;lt;span class="vote_count"&amp;gt;&amp;lt;%= shot.get_likes.size %&amp;gt;&amp;lt;/span&amp;gt;
       &amp;lt;% end %&amp;gt;
     &amp;lt;% end %&amp;gt;
   &amp;lt;% else %&amp;gt;
       &amp;lt;%= link_to like_shot_path(shot), method: :put, class: "like_shot" do %&amp;gt;
         &amp;lt;span class="icon"&amp;gt;&amp;lt;i class="fa fa-heart"&amp;gt;&amp;lt;/i&amp;gt;&amp;lt;/span&amp;gt;
         &amp;lt;span class="vote_count"&amp;gt;&amp;lt;%= shot.get_likes.size %&amp;gt;&amp;lt;/span&amp;gt;
       &amp;lt;% end %&amp;gt;
    &amp;lt;% end %&amp;gt;
---
config/routes.rb
---
Rails.application.routes.draw do
  resources :shots do
    resources :comments
    member do
        put 'like', to: "shots#like"
        put 'unlike', to: "shots#unlike"
    end
end

  devise_for :users, controllers: { registrations: 'registrations' }
  root 'shots#index'
end
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://ws2.sinaimg.cn/large/006tKfTcgy1fpx39kti85j31kw0fx77b.jpg" title="" alt="image"&gt;&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;app/views/shots/show.html.erb
---
&amp;lt;div class="panel-block likes data"&amp;gt;
  &amp;lt;% if user_signed_in? %&amp;gt;
    &amp;lt;% if current_user.liked? @shot %&amp;gt;
      &amp;lt;%= link_to unlike_shot_path(@shot), method: :put, class: "unlike_shot" do %&amp;gt;
        &amp;lt;span class="icon"&amp;gt;&amp;lt;i class="fa fa-heart has-text-primary"&amp;gt;&amp;lt;/i&amp;gt;&amp;lt;/span&amp;gt;
        &amp;lt;span class="vote_count"&amp;gt;&amp;lt;%= pluralize(@shot.get_likes.size, 'Like') %&amp;gt;&amp;lt;/span&amp;gt;
      &amp;lt;% end %&amp;gt;
    &amp;lt;% else %&amp;gt;
      &amp;lt;%= link_to like_shot_path(@shot), method: :put, class: "like_shot" do %&amp;gt;
        &amp;lt;span class="icon"&amp;gt;&amp;lt;i class="fa fa-heart"&amp;gt;&amp;lt;/i&amp;gt;&amp;lt;/span&amp;gt;
        &amp;lt;span class="vote_count"&amp;gt;&amp;lt;%= pluralize(@shot.get_likes.size, 'Like') %&amp;gt;&amp;lt;/span&amp;gt;
      &amp;lt;% end %&amp;gt;
    &amp;lt;% end %&amp;gt;
  &amp;lt;% else %&amp;gt;
      &amp;lt;%= link_to like_shot_path(@shot), method: :put, class: "like_shot" do %&amp;gt;
        &amp;lt;span class="icon"&amp;gt;&amp;lt;i class="fa fa-heart"&amp;gt;&amp;lt;/i&amp;gt;&amp;lt;/span&amp;gt;
        &amp;lt;span class="vote_count"&amp;gt;&amp;lt;%= pluralize(@shot.get_likes.size, 'Like') %&amp;gt;&amp;lt;/span&amp;gt;
      &amp;lt;% end %&amp;gt;
  &amp;lt;% end %&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://ws4.sinaimg.cn/large/006tKfTcgy1fpx3cu60svj31kw0k7acz.jpg" title="" alt="image"&gt;&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git add .
git commit -m "add acts_as_votable"
git push origin acts_as_votable
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://ws3.sinaimg.cn/large/006tKfTcgy1fpx3hn0zuyj31ei0c4tcd.jpg" title="" alt="image"&gt;&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git checkout -b hero
app/views/shots/_hero.html.erb
---
&amp;lt;% if !user_signed_in? %&amp;gt;
    &amp;lt;section class="hero is-dark"&amp;gt;
        &amp;lt;div class="hero-body"&amp;gt;
            &amp;lt;div class="container has-text-centered"&amp;gt;
                &amp;lt;h1 class="title is-size-5"&amp;gt;
                    What are you working on? &amp;lt;span class="has-text-grey-light"&amp;gt;Dribbble is where designers get inspired and hired.&amp;lt;/span&amp;gt;
                &amp;lt;/h1&amp;gt;
                &amp;lt;div class="content"&amp;gt;
                    &amp;lt;%= link_to "Login", new_user_session_path, class: "button is-primary" %&amp;gt;
                &amp;lt;/div&amp;gt;
            &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
    &amp;lt;/section&amp;gt;
&amp;lt;% end %&amp;gt;
---

app/views/shots/index.html.erb
---
&amp;lt;%= render 'hero' %&amp;gt;
---
app/assets/javascripts/application.js
---
//= require rails-ujs
//= require turbolinks
//= require jquery
//= require jquery_ujs
//= require_tree .
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="最后的表现效果"&gt;最后的表现效果&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://ws1.sinaimg.cn/large/006tKfTcgy1fpx3wh2o6gj31kw0ltae8.jpg" title="" alt="image"&gt;&lt;/p&gt;</description>
      <author>xiaoweirails</author>
      <pubDate>Sun, 01 Apr 2018 13:55:45 +0800</pubDate>
      <link>https://ruby-china.org/topics/35376</link>
      <guid>https://ruby-china.org/topics/35376</guid>
    </item>
    <item>
      <title>让我们用 Ruby on Rails 构建一个 Twitter</title>
      <description>&lt;h2 id="才华横溢 twitter 教学案例"&gt;才华横溢 twitter 教学案例&lt;/h2&gt;&lt;h2 id="Let's Build: A Twitter Clone With Ruby on Rails"&gt;Let's Build: A Twitter Clone With Ruby on Rails&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://ws3.sinaimg.cn/large/006tKfTcgy1fpv231vlabj31kw0n6tg0.jpg" title="" alt="image"&gt;
&lt;img src="https://ws1.sinaimg.cn/large/006tKfTcgy1fpv22x38bij31kw0ifjti.jpg" title="" alt="image"&gt;
&lt;img src="https://ws2.sinaimg.cn/large/006tKfTcgy1fpv22ss7gdj31kw0id40m.jpg" title="" alt="image"&gt;&lt;/p&gt;
&lt;h2 id="本案例主要完成了"&gt;本案例主要完成了&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;gem 的使用&lt;/li&gt;
&lt;li&gt;crud 功能 + layouts 导航&lt;/li&gt;
&lt;li&gt;devise 的使用&lt;/li&gt;
&lt;li&gt;scss 的使用&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="Github Repo:"&gt;Github Repo:&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://github.com/shenzhoudance/twitter" rel="nofollow" target="_blank"&gt;https://github.com/shenzhoudance/twitter&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;属于一个基本的案例&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd workspace
rails new twitter
cd tiwwter
git init
git add .
git commit -m "initial commit"
git remote add origin https://github.com/shenzhoudance/twitter.git
git push -u origin master
rails s
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://ws3.sinaimg.cn/large/006tNc79gy1fpsnyw9fzwj313m0z01kx.jpg" title="" alt="image"&gt;&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git checkout -b scaffold
rails g scaffold Tweeet tweeet：text
rake db:migrate
git add .
git commit -m "sacffold tweeet"
rails s
&lt;/code&gt;&lt;/pre&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;config/routes.rb
---
Rails.application.routes.draw do
  resources :tweeets
  root 'tweeets#index'

end
----
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://ws4.sinaimg.cn/large/006tNc79gy1fpso61lkjgj30ni0aoaam.jpg" title="" alt="image"&gt;&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git checkout -b gem
https://rubygems.org/
---
group :development do
---
gem 'better_errors', '~&amp;gt; 2.4'
gem 'guard', '~&amp;gt; 2.14', '&amp;gt;= 2.14.2'
gem 'guard-livereload', '~&amp;gt; 2.5', '&amp;gt;= 2.5.2', require: false
---
bundle install
guard init livereload
bundle exec guard
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://ws4.sinaimg.cn/large/006tNc79gy1fpsokdabp5j31kw0tfdns.jpg" title="" alt="image"&gt;&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;---
gem 'bulma-rails', '~&amp;gt; 0.6.2'
gem 'simple_form', '~&amp;gt; 3.5', '&amp;gt;= 3.5.1'
gem 'gravatar_image_tag', '~&amp;gt; 1.2'
gem 'devise', '~&amp;gt; 4.4', '&amp;gt;= 4.4.3'
---
bundle install
rails s
---
app/assets/stylesheets/application.scss
@import "bulma";
---
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://ws3.sinaimg.cn/large/006tNc79gy1fpsostbjffj30rg0cyt9o.jpg" title="" alt="image"&gt;
&lt;img src="https://ws4.sinaimg.cn/large/006tNc79gy1fpsosobo67j30j8088gmk.jpg" title="" alt="image"&gt;&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;rails generate simple_form:install
rails generate devise:install
rails generate devise:views
---
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://ws4.sinaimg.cn/large/006tNc79gy1fpsotw13iij31kw0hoteo.jpg" title="" alt="image"&gt;&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git status
git add .
git commit -m "add gems"
git push origin gem
&lt;/code&gt;&lt;/pre&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git checkout -b nav
app/views/layouts/application.html.erb
---
&amp;lt;body&amp;gt;
  &amp;lt;% if flash[:notice] %&amp;gt;
  &amp;lt;div class="notification is-primary global-notification"&amp;gt;
    &amp;lt;p class="notice"&amp;gt;&amp;lt;%= notice %&amp;gt;&amp;lt;/p&amp;gt;
  &amp;lt;/div&amp;gt;
  &amp;lt;% end %&amp;gt;
  &amp;lt;% if flash[:alert] %&amp;gt;
  &amp;lt;div class="notification is-danger global-notification"&amp;gt;
    &amp;lt;p class="alert"&amp;gt;&amp;lt;%= alert %&amp;gt;&amp;lt;/p&amp;gt;
  &amp;lt;/div&amp;gt;
  &amp;lt;% end %&amp;gt;
&amp;lt;nav class="navbar is-info"&amp;gt;
&amp;lt;div class="navbar-brand"&amp;gt;
  &amp;lt;%= link_to root_path, class:"navbar-item" do %&amp;gt;
    &amp;lt;h1 class="title is-5"&amp;gt;Twittter&amp;lt;/h1&amp;gt;
  &amp;lt;% end  %&amp;gt;
  &amp;lt;div class="navbar-burger burger" data-target="navbarExample"&amp;gt;
    &amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;
    &amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;
    &amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;

&amp;lt;div id="navbarExample" class="navbar-menu"&amp;gt;

  &amp;lt;div class="navbar-end"&amp;gt;
    &amp;lt;div class="navbar-item"&amp;gt;
      &amp;lt;div class="field is-grouped"&amp;gt;
        &amp;lt;p class="control"&amp;gt;
          &amp;lt;%= link_to 'New Tweeet', new_tweeet_path, class:"button is-info is-inverted" %&amp;gt;
        &amp;lt;/p&amp;gt;

      &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/nav&amp;gt;
  &amp;lt;%= yield %&amp;gt;
&amp;lt;/body&amp;gt;
---
app/assets/stylesheets/application.scss
---
.navbar-brand .title {
    color: white;
}
// round images
.image {
    border-radius: 50%;
    img {
        border-radius: 50%;
    }
}

.notification:not(:last-child) {
    margin-bottom: 0;
}
---
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://ws3.sinaimg.cn/large/006tNbRwgy1fpti6ob5wxj31kw0c840j.jpg" title="" alt="image"&gt;
&lt;img src="https://ws1.sinaimg.cn/large/006tNbRwgy1fpthyq513oj31kw09e75o.jpg" title="" alt="image"&gt;
&lt;img src="https://ws3.sinaimg.cn/large/006tNbRwgy1fpthyk516ij31kw09amyg.jpg" title="" alt="image"&gt;&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git status
git add .
git commit -m "add nav"
git push origin nav
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://ws2.sinaimg.cn/large/006tNbRwgy1fpti1f3hxmj31380k0q7h.jpg" title="" alt="image"&gt;&lt;/p&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;git checkout -b views
app/views/layouts/application.html.erb
---
&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;Twittter&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;csrf_meta_tags&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;stylesheet_link_tag&lt;/span&gt;    &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="na"&gt;application&lt;/span&gt;&lt;span class="err"&gt;',&lt;/span&gt; &lt;span class="na"&gt;media:&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="na"&gt;all&lt;/span&gt;&lt;span class="err"&gt;',&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="na"&gt;data-turbolinks-track&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="na"&gt;:&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="na"&gt;reload&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;stylesheet_link_tag&lt;/span&gt; &lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="na"&gt;https:&lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="na"&gt;maxcdn.bootstrapcdn.com&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="na"&gt;font-awesome&lt;/span&gt;&lt;span class="err"&gt;/4.7.0/&lt;/span&gt;&lt;span class="na"&gt;css&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="na"&gt;font-awesome.min.css&lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;javascript_include_tag&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="na"&gt;application&lt;/span&gt;&lt;span class="err"&gt;',&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="na"&gt;data-turbolinks-track&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="na"&gt;:&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="na"&gt;reload&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt; &lt;span class="na"&gt;if&lt;/span&gt; &lt;span class="na"&gt;flash&lt;/span&gt;&lt;span class="err"&gt;[&lt;/span&gt;&lt;span class="na"&gt;:notice&lt;/span&gt;&lt;span class="err"&gt;]&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"notification is-primary global-notification"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;p&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"notice"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;notice&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt; &lt;span class="na"&gt;end&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt; &lt;span class="na"&gt;if&lt;/span&gt; &lt;span class="na"&gt;flash&lt;/span&gt;&lt;span class="err"&gt;[&lt;/span&gt;&lt;span class="na"&gt;:alert&lt;/span&gt;&lt;span class="err"&gt;]&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"notification is-danger global-notification"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;p&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"alert"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;alert&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt; &lt;span class="na"&gt;end&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;nav&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"navbar is-info"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"navbar-brand"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;link_to&lt;/span&gt; &lt;span class="na"&gt;root_path&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;class:&lt;/span&gt; &lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="na"&gt;navbar-item&lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt; &lt;span class="na"&gt;do&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;h1&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"title is-5"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Twittter&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt; &lt;span class="na"&gt;end&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"navbar-burger burger"&lt;/span&gt; &lt;span class="na"&gt;data-target=&lt;/span&gt;&lt;span class="s"&gt;"navbarExample"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
     &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

            &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"navbarExample"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"navbar-menu"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"navbar-end"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"navbar-item"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"field is-grouped"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;p&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"control"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                            &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;link_to&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="na"&gt;New&lt;/span&gt; &lt;span class="na"&gt;Tweeet&lt;/span&gt;&lt;span class="err"&gt;',&lt;/span&gt; &lt;span class="na"&gt;new_tweeet_path&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;class:&lt;/span&gt; &lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="na"&gt;button&lt;/span&gt; &lt;span class="na"&gt;is-info&lt;/span&gt; &lt;span class="na"&gt;is-inverted&lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;

            &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/nav&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;yield&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
---
&lt;/code&gt;&lt;/pre&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;app/views/tweeets/index.html.erb
---
&amp;lt;section class="section"&amp;gt;
  &amp;lt;div class="container"&amp;gt;
    &amp;lt;div class="columns"&amp;gt;
      &amp;lt;%= render 'trends' %&amp;gt;
      &amp;lt;%= render 'feed' %&amp;gt;
      &amp;lt;%= render 'who-to-follow' %&amp;gt;
    &amp;lt;/div&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/section&amp;gt;
--
app/views/tweeets/_feed.html.erb
---

&amp;lt;div class="column is-half"&amp;gt;

    &amp;lt;article class="media box"&amp;gt;
        &amp;lt;figure class="media-left"&amp;gt;
            &amp;lt;p class="image is-64x64"&amp;gt;
                &amp;lt;img src="https://buimd.io/images/placeholders/64x64.png"&amp;gt;
            &amp;lt;/p&amp;gt;
        &amp;lt;/figure&amp;gt;
        &amp;lt;div class="media-content"&amp;gt;
        &amp;lt;%= render 'tweeets/form' %&amp;gt;
        &amp;lt;/div&amp;gt;
    &amp;lt;/article&amp;gt;



&amp;lt;% @tweeets.each do | tweeet | %&amp;gt;
  &amp;lt;div class="box"&amp;gt;
    &amp;lt;article class="media"&amp;gt;
        &amp;lt;div class="media-left"&amp;gt;
            &amp;lt;figure class="image is-64x64"&amp;gt;
                &amp;lt;img src="https://buimd.io/images/placeholders/64x64.png"&amp;gt;
            &amp;lt;/figure&amp;gt;
        &amp;lt;/div&amp;gt;
        &amp;lt;div class="media-content"&amp;gt;
            &amp;lt;div class="content"&amp;gt;
                &amp;lt;strong&amp;gt;xiaowei&amp;lt;/strong&amp;gt;&amp;lt;br /&amp;gt;
                &amp;lt;small&amp;gt;xiaowei&amp;lt;/small&amp;gt;&amp;lt;br/&amp;gt;

            &amp;lt;/div&amp;gt;

            &amp;lt;nav class="level"&amp;gt;
                &amp;lt;div class="level-left is-mobile"&amp;gt;
                    &amp;lt;%= link_to tweeet, class: "level-item" do %&amp;gt;
                      &amp;lt;span class="icon"&amp;gt;&amp;lt;i class="fa fa-link" aria-hidden="true"&amp;gt;&amp;lt;/i&amp;gt;&amp;lt;/span&amp;gt;
                    &amp;lt;% end %&amp;gt;
                    &amp;lt;%= link_to edit_tweeet_path(tweeet), class: "level-item" do %&amp;gt;
                      &amp;lt;span class="icon"&amp;gt;&amp;lt;i class="fa fa-pencil" aria-hidden="true"&amp;gt;&amp;lt;/i&amp;gt;&amp;lt;/span&amp;gt;
                    &amp;lt;% end %&amp;gt;
                    &amp;lt;%= link_to tweeet, method: :delete, data: { confirm: "Are you sure you want to delete this tweeet?" } do %&amp;gt;
                            &amp;lt;span class="icon"&amp;gt;&amp;lt;i class="fa fa-trash-o" aria-hidden="true"&amp;gt;&amp;lt;/i&amp;gt;&amp;lt;/span&amp;gt;
                &amp;lt;% end %&amp;gt;
                &amp;lt;/div&amp;gt;
            &amp;lt;/nav&amp;gt;

        &amp;lt;/div&amp;gt;
    &amp;lt;/article&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;% end %&amp;gt;
&amp;lt;/div&amp;gt;
---
app/views/tweeets/_who-to-follow.html.erb
---
&amp;lt;div class="column"&amp;gt;
    &amp;lt;nav class="panel"&amp;gt;
        &amp;lt;p class="panel-heading"&amp;gt;Who to Follow&amp;lt;/p&amp;gt;

    &amp;lt;div class="panel-block"&amp;gt;
        &amp;lt;article class="media"&amp;gt;
            &amp;lt;div class="media-left"&amp;gt;
                &amp;lt;figure class="image is-32x32"&amp;gt;
                    &amp;lt;img src="https://bulma.io/images/placeholders/64x64.png"&amp;gt;
                &amp;lt;/figure&amp;gt;
            &amp;lt;/div&amp;gt;
            &amp;lt;div class="media-content"&amp;gt;
                &amp;lt;div class="content"&amp;gt;
                    &amp;lt;p&amp;gt;
                        &amp;lt;strong&amp;gt;xiaowei&amp;lt;/strong&amp;gt;
                        &amp;lt;small&amp;gt;@xiaowei&amp;lt;/small&amp;gt;
                    &amp;lt;/p&amp;gt;
                &amp;lt;/div&amp;gt;
            &amp;lt;/div&amp;gt;
        &amp;lt;/article&amp;gt;
    &amp;lt;/div&amp;gt;
        &amp;lt;div class="panel-block"&amp;gt;
        &amp;lt;article class="media"&amp;gt;
            &amp;lt;div class="media-left"&amp;gt;
                &amp;lt;figure class="image is-32x32"&amp;gt;
                    &amp;lt;img src="https://bulma.io/images/placeholders/64x64.png"&amp;gt;
                &amp;lt;/figure&amp;gt;
            &amp;lt;/div&amp;gt;
            &amp;lt;div class="media-content"&amp;gt;
                &amp;lt;div class="content"&amp;gt;
                    &amp;lt;p&amp;gt;
                        &amp;lt;strong&amp;gt;xiaowei&amp;lt;/strong&amp;gt;
                        &amp;lt;small&amp;gt;@xiaowei&amp;lt;/small&amp;gt;
                    &amp;lt;/p&amp;gt;
                &amp;lt;/div&amp;gt;
            &amp;lt;/div&amp;gt;
        &amp;lt;/article&amp;gt;
    &amp;lt;/div&amp;gt;
        &amp;lt;div class="panel-block"&amp;gt;
        &amp;lt;article class="media"&amp;gt;
            &amp;lt;div class="media-left"&amp;gt;
                &amp;lt;figure class="image is-32x32"&amp;gt;
                    &amp;lt;img src="https://bulma.io/images/placeholders/64x64.png"&amp;gt;
                &amp;lt;/figure&amp;gt;
            &amp;lt;/div&amp;gt;
            &amp;lt;div class="media-content"&amp;gt;
                &amp;lt;div class="content"&amp;gt;
                    &amp;lt;p&amp;gt;
                        &amp;lt;strong&amp;gt;xiaowei&amp;lt;/strong&amp;gt;
                        &amp;lt;small&amp;gt;@xiaowei&amp;lt;/small&amp;gt;
                    &amp;lt;/p&amp;gt;
                &amp;lt;/div&amp;gt;
            &amp;lt;/div&amp;gt;
        &amp;lt;/article&amp;gt;
    &amp;lt;/div&amp;gt;
    &amp;lt;/nav&amp;gt;
&amp;lt;/div&amp;gt;
---
app/views/tweeets/_trends.html.erb
---
&amp;lt;div class="column is-one-quarter"&amp;gt;
    &amp;lt;nav class="panel"&amp;gt;
        &amp;lt;p class="panel-heading"&amp;gt;Trends&amp;lt;/p&amp;gt;
        &amp;lt;a class="panel-block"&amp;gt;
            Trend 1
        &amp;lt;/a&amp;gt;
        &amp;lt;a class="panel-block"&amp;gt;
            Trend 2
        &amp;lt;/a&amp;gt;
        &amp;lt;a class="panel-block"&amp;gt;
            Trend 3
        &amp;lt;/a&amp;gt;
        &amp;lt;a class="panel-block"&amp;gt;
            Trend 4
        &amp;lt;/a&amp;gt;
        &amp;lt;a class="panel-block"&amp;gt;
            Trend 5
        &amp;lt;/a&amp;gt;
        &amp;lt;a class="panel-block"&amp;gt;
            Trend 6
        &amp;lt;/a&amp;gt;
    &amp;lt;/nav&amp;gt;
&amp;lt;/div&amp;gt;
---
app/views/tweeets/_form.html.erb
---

&amp;lt;%= simple_form_for(@tweeet) do |f| %&amp;gt;
&amp;lt;%= f.error_notification %&amp;gt;
&amp;lt;div class="field"&amp;gt;
  &amp;lt;div class="control"&amp;gt;
    &amp;lt;%= f.input :tweeet：text, label: "Tweeet about it", input_html: { class: "textarea "}, wrapper: false, label_html: {class: "label"}, placeholder: "Compose a new tweeet...", autofocus: true %&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;%= f.button :submit, class: "button is-info" %&amp;gt;
&amp;lt;% end %&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="最后效果"&gt;最后效果&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://ws1.sinaimg.cn/large/006tKfTcgy1fpunnpd3qdj31kw0s50xk.jpg" title="" alt="image"&gt;&lt;/p&gt;

&lt;p&gt;git status
git add .
git commit -m "add index feed trends Who &amp;amp; edit form"
git push origin views&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git checkout -b devise
app/controllers/tweeets_controller.rb
---
def create
  @tweeet = Tweeet.new(tweeet_params)

  respond_to do |format|
    if @tweeet.save
      format.html { redirect_to root_path, notice: 'Tweeet was successfully created.' }
      format.json { render :show, status: :created, location: @tweeet }
    else
      format.html { render :new }
      format.json { render json: @tweeet.errors, status: :unprocessable_entity }
    end
  end
end
---
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://ws1.sinaimg.cn/large/006tKfTcgy1fpuvmsn231j31kw0u178l.jpg" title="" alt="image"&gt;&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;rails g devise User
rails db:migrate
git status
git add .
git commit -m "add layout and markup devise user model"
rake routes
http://localhost:3000/users/sign_up
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://ws3.sinaimg.cn/large/006tKfTcgy1fpuvvno5mtj31is0oeteg.jpg" title="" alt="image"&gt;
&lt;img src="https://ws2.sinaimg.cn/large/006tKfTcgy1fpuvvigoshj316g0ledlk.jpg" title="" alt="image"&gt;
&lt;img src="https://ws4.sinaimg.cn/large/006tKfTcgy1fpuvxem6epj31kw0eymzi.jpg" title="" alt="image"&gt;&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;app/controllers/tweeets_controller.rb
---
before_action :set_tweeet, only: [:show, :edit, :update, :destroy]
before_action :authenticate_user!, except: [:index, :show]

app/controllers/registrations_controller.rb
---

class RegistrationsController &amp;lt; Devise::RegistrationsController

    private

    def sign_up_params
        params.require(:user).permit(:name, :username, :email, :password, :password_confirmation)
    end

    def acount_update_params
        params.require(:user).permit(:name, :username, :email, :password, :password_confirmation, :current_password)
    end

end
---
&lt;/code&gt;&lt;/pre&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;rails g migration AddFieldsToUsers
db/migrate/20180330074858_add_fields_to_users.rb
---
class AddFieldsToUsers &amp;lt; ActiveRecord::Migration[5.1]
  def change
    add_column :users, :name, :string
    add_column :users, :username, :string
    add_index :users, :username, unique: true
   end
 end
---
rake db:migrate
&lt;/code&gt;&lt;/pre&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;app/views/devise/registrations/new.html.erb
---
&amp;lt;h2&amp;gt;Sign up&amp;lt;/h2&amp;gt;

&amp;lt;%= simple_form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %&amp;gt;
  &amp;lt;%= f.error_notification %&amp;gt;

  &amp;lt;div class="form-inputs"&amp;gt;
    &amp;lt;%= f.input :email, required: true, autofocus: true %&amp;gt;
    &amp;lt;%= f.input :password, required: true, hint: ("#{@minimum_password_length} characters minimum" if @minimum_password_length) %&amp;gt;
    &amp;lt;%= f.input :password_confirmation, required: true %&amp;gt;
  &amp;lt;/div&amp;gt;

  &amp;lt;div class="form-actions"&amp;gt;
    &amp;lt;%= f.button :submit, "Sign up" %&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;% end %&amp;gt;

&amp;lt;%= render "devise/shared/links" %&amp;gt;

---
&amp;lt;div class="section"&amp;gt;
    &amp;lt;div class="container"&amp;gt;
    &amp;lt;div class="columns is-centered"&amp;gt;

        &amp;lt;div class="column is-4"&amp;gt;

        &amp;lt;h2 class="title is-2"&amp;gt;Sign Up&amp;lt;/h2&amp;gt;

        &amp;lt;%= simple_form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %&amp;gt;
      &amp;lt;%= f.error_notification %&amp;gt;

      &amp;lt;div class="field"&amp;gt;
        &amp;lt;div class="control"&amp;gt;
        &amp;lt;%= f.input :name, required: true, autofocus: true, input_html: { class:"input" }, wrapper: false, label_html: { class:"label" } %&amp;gt;
        &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;

        &amp;lt;div class="field"&amp;gt;
        &amp;lt;div class="control"&amp;gt;
        &amp;lt;%= f.input :username, required: true, input_html: { class:"input" }, wrapper: false, label_html: { class:"label" } %&amp;gt;
        &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;

        &amp;lt;div class="field"&amp;gt;
        &amp;lt;div class="control"&amp;gt;
        &amp;lt;%= f.input :email, required: true, input_html: { class:"input" }, wrapper: false, label_html: { class:"label" } %&amp;gt;
        &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;


        &amp;lt;div class="field"&amp;gt;
            &amp;lt;div class="control"&amp;gt;
                &amp;lt;%= f.input :password, required: true, input_html: { class:"input" }, wrapper: false, label_html: { class:"label" }, hint: ("#{@minimum_password_length} characters minimum" if @minimum_password_length) %&amp;gt;
            &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;

        &amp;lt;div class="field"&amp;gt;
            &amp;lt;div class="control"&amp;gt;
                &amp;lt;%= f.input :password_confirmation, required: true, input_html: { class: "input" }, wrapper: false, label_html: { class: "label" } %&amp;gt;       
            &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;

        &amp;lt;div class="field"&amp;gt;
            &amp;lt;div class="control"&amp;gt;
                &amp;lt;%= f.button :submit, "Sign up", class:"button is-info is-medium" %&amp;gt;
            &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;

        &amp;lt;% end %&amp;gt;
            &amp;lt;br /&amp;gt;
            &amp;lt;%= render "devise/shared/links" %&amp;gt;
        &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
---
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://ws3.sinaimg.cn/large/006tKfTcgy1fpuwl5oj6sj31kw0ud0wf.jpg" title="" alt="image"&gt;&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;app/models/tweeet.rb
---
class Tweeet &amp;lt; ApplicationRecord
  belongs_to :user
end
---
app/models/user.rb
---
class User &amp;lt; ApplicationRecord
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable
  has_many :tweeets
end
---
rails g migration AddUserIdToTweeets user_id:integer
rake db:migrate
&lt;/code&gt;&lt;/pre&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;rails c
2.3.1 :001 &amp;gt; @user = User
2.3.1 :002 &amp;gt; User.connection
2.3.1 :003 &amp;gt; @user
2.3.1 :004 &amp;gt; @tweeet = Tweeet
2.3.1 :005 &amp;gt; exit
&lt;/code&gt;&lt;/pre&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;app/controllers/tweeets_controller.rb
---
before_action :set_tweeet, only: [:show, :edit, :update, :destroy]
before_action :authenticate_user!, except: [:index, :show]

def new
  @tweeet = current_user.tweeets.build
end

# GET /tweeets/1/edit
def edit
end

# POST /tweeets
# POST /tweeets.json
def create
  @tweeet = current_user.tweeets.build(tweeet_params)

---
app/views/layouts/application.html.erb
---
&amp;lt;p class="control"&amp;gt;
  &amp;lt;%= link_to 'New Tweeet', new_tweeet_path, class: "button is-info is-inverted" %&amp;gt;
&amp;lt;/p&amp;gt;

&amp;lt;% if user_signed_in? %&amp;gt;
    &amp;lt;p class="control"&amp;gt;
      &amp;lt;%= link_to current_user.name, edit_user_registration_path, class: "button is-info" %&amp;gt;
    &amp;lt;/p&amp;gt;
    &amp;lt;p&amp;gt;
      &amp;lt;%= link_to "Logout", destroy_user_session_path, method: :delete, class:"button is-info" %&amp;gt;
    &amp;lt;/p&amp;gt;
  &amp;lt;% else %&amp;gt;
  &amp;lt;p class="control"&amp;gt;
    &amp;lt;%= link_to 'Sign In', new_user_session_path, class: "button is-info" %&amp;gt;
  &amp;lt;/p&amp;gt;
  &amp;lt;p class="control"&amp;gt;
    &amp;lt;%= link_to 'Sign Up', new_user_registration_path, class: "button is-info" %&amp;gt;
  &amp;lt;/p&amp;gt;
 &amp;lt;% end %&amp;gt;
 ---
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://ws3.sinaimg.cn/large/006tKfTcgy1fpuz9wcdwij31kw0nhjv7.jpg" title="" alt="image"&gt;&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;---
rails c
2.3.1 :001 &amp;gt; @user = User
2.3.1 :002 &amp;gt; User.connection
2.3.1 :003 &amp;gt; @user.last
---
config/routes.rb
---
Rails.application.routes.draw do
  devise_for :users, :controllers =&amp;gt; { registrations: 'registrations' }
  resources :tweeets
  root "tweeets#index"
end
---
2.3.1 :004 &amp;gt; @user.destroy
2.3.1 :005 &amp;gt; @user.delete
2.3.1 :006 &amp;gt; @user = @user.last
2.3.1 :007 &amp;gt; @user
2.3.1 :008 &amp;gt; @user.destroy
2.3.1 :009 &amp;gt; @user = User
2.3.1 :010 &amp;gt; @user.all
2.3.1 :011 &amp;gt; exit
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://ws1.sinaimg.cn/large/006tKfTcgy1fpuzpas3ckj31kw0mhak0.jpg" title="" alt="image"&gt;
&lt;img src="https://ws4.sinaimg.cn/large/006tKfTcgy1fpuzp5kqhaj31kw0ron28.jpg" title="" alt="image"&gt;&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;rails c
2.3.1 :001 &amp;gt; @user = User
2.3.1 :002 &amp;gt; User.connection
2.3.1 :003 &amp;gt; @user.all
2.3.1 :004 &amp;gt; exit
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://ws4.sinaimg.cn/large/006tKfTcgy1fpuzw4oc8wj314y0e8q83.jpg" title="" alt="image"&gt;&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;rails c
2.3.1 :001 &amp;gt; @tweeet = Tweeet
2.3.1 :002 &amp;gt; Tweeet.connection
2.3.1 :003 &amp;gt; @tweeet.all
2.3.1 :004 &amp;gt; @tweeet = Tweeet
2.3.1 :005 &amp;gt; @tweeet.all
2.3.1 :006 &amp;gt; @user = User
2.3.1 :007 &amp;gt; @user.tweeets
2.3.1 :008 &amp;gt; current_user.tweeets
2.3.1 :009 &amp;gt; exit
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://ws1.sinaimg.cn/large/006tKfTcgy1fpv0273qnpj314w0oc0zo.jpg" title="" alt="image"&gt;&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git status
git add .
git commit -m "add devise &amp;amp; layouts"
git push origin devise
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://ws3.sinaimg.cn/large/006tKfTcly1fpv05fplhbj31fm0x0wmy.jpg" title="" alt="image"&gt;&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git checkout -b username
---
app/views/tweeets/_feed.html.erb
---
&amp;lt;% if user_signed_in? &amp;amp;&amp;amp; current_user.id == tweeet.user_id %&amp;gt;
       &amp;lt;nav class="level"&amp;gt;
         &amp;lt;div class="level-left is-mobile"&amp;gt;
           &amp;lt;%= link_to tweeet, class: "level-item" do %&amp;gt;
             &amp;lt;span class="icon"&amp;gt;&amp;lt;i class="fa fa-link" aria-hidden="true"&amp;gt;&amp;lt;/i&amp;gt;&amp;lt;/span&amp;gt;
           &amp;lt;% end %&amp;gt;
           &amp;lt;%= link_to edit_tweeet_path(tweeet), class: "level-item" do %&amp;gt;
             &amp;lt;span class="icon"&amp;gt;&amp;lt;i class="fa fa-pencil" aria-hidden="true"&amp;gt;&amp;lt;/i&amp;gt;&amp;lt;/span&amp;gt;
           &amp;lt;% end %&amp;gt;
           &amp;lt;%= link_to tweeet, method: :delete, data: { confirm: "Are you sure you want to delete this tweeet?" } do %&amp;gt;
               &amp;lt;span class="icon"&amp;gt;&amp;lt;i class="fa fa-trash-o" aria-hidden="true"&amp;gt;&amp;lt;/i&amp;gt;&amp;lt;/span&amp;gt;
           &amp;lt;% end %&amp;gt;
         &amp;lt;/div&amp;gt;
       &amp;lt;/nav&amp;gt;
       &amp;lt;% end %&amp;gt;
---
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://ws3.sinaimg.cn/large/006tKfTcgy1fpv0zrad36j31kw0qktdn.jpg" title="" alt="image"&gt;
&lt;img src="https://ws2.sinaimg.cn/large/006tKfTcgy1fpv0zn24haj31kw0p6n1q.jpg" title="" alt="image"&gt;&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;% if user_signed_in? %&amp;gt;
 &amp;lt;article class="media box"&amp;gt;
   &amp;lt;figure class="media-left"&amp;gt;
     &amp;lt;p class="image is-64x64"&amp;gt;
       &amp;lt;img src="https://buimd.io/images/placeholders/64x64.png"&amp;gt;
     &amp;lt;/p&amp;gt;
   &amp;lt;/figure&amp;gt;
   &amp;lt;div class="media-content"&amp;gt;
       &amp;lt;%= render 'tweeets/form' %&amp;gt;
   &amp;lt;/div&amp;gt;
 &amp;lt;/article&amp;gt;
&amp;lt;% end %&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://ws3.sinaimg.cn/large/006tKfTcgy1fpv12zz2mlj31kw0m5q6r.jpg" title="" alt="image"&gt;&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;app/views/tweeets/index.html.erb
---
&amp;lt;section class="section"&amp;gt;
  &amp;lt;div class="container"&amp;gt;
    &amp;lt;div class="columns"&amp;gt;
      &amp;lt;%= render 'trends' %&amp;gt;
      &amp;lt;%= render 'feed' %&amp;gt;
      &amp;lt;%= render 'who-to-follow' %&amp;gt;
    &amp;lt;/div&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/section&amp;gt;
---
app/views/tweeets/_profile.html.erb
---
&amp;lt;div class="column is-one-quarter"&amp;gt;
    &amp;lt;nav class="panel"&amp;gt;
        &amp;lt;p class="panel-heading"&amp;gt;Profile&amp;lt;/p&amp;gt;
        &amp;lt;div class="panel-block"&amp;gt;
            &amp;lt;article class="media"&amp;gt;
                &amp;lt;div class="media-left"&amp;gt;
                    &amp;lt;figure class="image is-64x64"&amp;gt;
                        &amp;lt;%= gravatar_image_tag(current_user.email, size: 64, alt: current_user.name) %&amp;gt;
                    &amp;lt;/figure&amp;gt;
                &amp;lt;/div&amp;gt;
                &amp;lt;div class="media-content"&amp;gt;
                    &amp;lt;div class="content"&amp;gt;
                        &amp;lt;p&amp;gt;
                            &amp;lt;strong&amp;gt;&amp;lt;%= current_user.name %&amp;gt;&amp;lt;/strong&amp;gt;&amp;lt;br /&amp;gt;
                            &amp;lt;small&amp;gt;&amp;lt;%= current_user.username %&amp;gt;&amp;lt;/small&amp;gt;
                        &amp;lt;/p&amp;gt;
                    &amp;lt;/div&amp;gt;
                &amp;lt;/div&amp;gt;
            &amp;lt;/article&amp;gt;
        &amp;lt;/div&amp;gt;
        &amp;lt;div class="panel-block"&amp;gt;
            &amp;lt;div class="level is-mobile"&amp;gt;
                &amp;lt;div class="level-item has-centered-text"&amp;gt;
                    &amp;lt;div&amp;gt;
                        &amp;lt;p class="heading"&amp;gt;Tweeets&amp;lt;/p&amp;gt;
                        &amp;lt;p class="title is-6"&amp;gt;&amp;lt;%= current_user.tweeets.count %&amp;gt;&amp;lt;/p&amp;gt;
                    &amp;lt;/div&amp;gt;
                &amp;lt;/div&amp;gt;
                &amp;lt;div class="level-item has-centered-text"&amp;gt;
                    &amp;lt;div&amp;gt;
                        &amp;lt;p class="heading"&amp;gt;Following&amp;lt;/p&amp;gt;
                        &amp;lt;p class="title is-6"&amp;gt;123&amp;lt;/p&amp;gt;
                    &amp;lt;/div&amp;gt;
                &amp;lt;/div&amp;gt;
                    &amp;lt;div class="level-item has-centered-text"&amp;gt;
                    &amp;lt;div&amp;gt;
                        &amp;lt;p class="heading"&amp;gt;Followers&amp;lt;/p&amp;gt;
                        &amp;lt;p class="title is-6"&amp;gt;465K&amp;lt;/p&amp;gt;
                    &amp;lt;/div&amp;gt;
                &amp;lt;/div&amp;gt;
            &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
    &amp;lt;/nav&amp;gt;
&amp;lt;/div&amp;gt;
---
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://ws3.sinaimg.cn/large/006tKfTcgy1fpv19fnt67j31kw0pb0y3.jpg" title="" alt="image"&gt;
&lt;img src="https://ws3.sinaimg.cn/large/006tKfTcgy1fpv19b2e91j31kw0pd0y3.jpg" title="" alt="image"&gt;
&lt;img src="https://ws3.sinaimg.cn/large/006tKfTcgy1fpv1c0skjkj31kw0ozgpx.jpg" title="" alt="image"&gt;&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git status
git add .
git commit -m "add user show"
git push origin username
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://ws3.sinaimg.cn/large/006tKfTcgy1fpv1e6jqxrj31600okq8k.jpg" title="" alt="image"&gt;&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git checkout -b gravatar_image_tag
app/views/tweeets/_feed.html.erb
app/views/tweeets/_who-to-follow.html.erb
&amp;lt;img src="https://bulma.io/images/placeholders/64x64.png"&amp;gt;
---
&amp;lt;%= gravatar_image_tag(current_user.email, size: 64, alt: current_user.name) %&amp;gt;
---
app/views/tweeets/edit.html.erb
&amp;lt;h1&amp;gt;Editing Tweeet&amp;lt;/h1&amp;gt;

&amp;lt;%= render 'form', tweeet: @tweeet %&amp;gt;

&amp;lt;%= link_to 'Show', @tweeet %&amp;gt; |
&amp;lt;%= link_to 'Back', tweeets_path %&amp;gt;
---
---
app/views/tweeets/new.html.erb
&amp;lt;h1&amp;gt;New Tweeet&amp;lt;/h1&amp;gt;

&amp;lt;%= render 'form', tweeet: @tweeet %&amp;gt;

&amp;lt;%= link_to 'Back', tweeets_path %&amp;gt;
---
&amp;lt;div class="section"&amp;gt;
    &amp;lt;div class="container"&amp;gt;
        &amp;lt;div class="columns is-centered"&amp;gt;
            &amp;lt;div class="column is-half"&amp;gt;
                &amp;lt;h1 class="title"&amp;gt;Create a new Tweeet&amp;lt;/h1&amp;gt;
                    &amp;lt;%= render 'form', tweeet: @tweeet %&amp;gt;
            &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;

&amp;lt;nav class="navbar is-fixed-bottom"&amp;gt;
    &amp;lt;div class="navbar-menu"&amp;gt;
        &amp;lt;div class="navbar-item"&amp;gt;
            &amp;lt;div class="field is-grouped"&amp;gt;
                &amp;lt;p class="control"&amp;gt;
                    &amp;lt;%= link_to 'Cancel', tweeets_path, class: "button is-dark" %&amp;gt;
                &amp;lt;/p&amp;gt;
        &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
&amp;lt;/nav&amp;gt;

---
app/views/tweeets/show.html.erb
&amp;lt;p id="notice"&amp;gt;&amp;lt;%= notice %&amp;gt;&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;
  &amp;lt;strong&amp;gt;Tweeet：text:&amp;lt;/strong&amp;gt;
  &amp;lt;%= @tweeet.tweeet：text %&amp;gt;
&amp;lt;/p&amp;gt;

&amp;lt;%= link_to 'Edit', edit_tweeet_path(@tweeet) %&amp;gt; |
&amp;lt;%= link_to 'Back', tweeets_path %&amp;gt;

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://ws3.sinaimg.cn/large/006tKfTcgy1fpv231vlabj31kw0n6tg0.jpg" title="" alt="image"&gt;
&lt;img src="https://ws1.sinaimg.cn/large/006tKfTcgy1fpv22x38bij31kw0ifjti.jpg" title="" alt="image"&gt;
&lt;img src="https://ws2.sinaimg.cn/large/006tKfTcgy1fpv22ss7gdj31kw0id40m.jpg" title="" alt="image"&gt;&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git status
git add .
git commit -m "add gravatar_image_tag"
git push origin gravatar_image_tag
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://ws2.sinaimg.cn/large/006tKfTcly1fpv28r8g5jj31e00h0djz.jpg" title="" alt="image"&gt;&lt;/p&gt;</description>
      <author>xiaoweirails</author>
      <pubDate>Fri, 30 Mar 2018 19:24:13 +0800</pubDate>
      <link>https://ruby-china.org/topics/35368</link>
      <guid>https://ruby-china.org/topics/35368</guid>
    </item>
    <item>
      <title>让我们使用 Ruby on Rails 构建：博客和评论</title>
      <description>&lt;h2 id="Let's Build: With Ruby On Rails - Blog With Comments"&gt;Let's Build: With Ruby On Rails - Blog With Comments&lt;/h2&gt;&lt;h2 id="案例分析："&gt;案例分析：&lt;/h2&gt;&lt;h3 id="构建 demo_blog 的案例的关键在于完成三个维度的动作："&gt;构建 demo_blog 的案例的关键在于完成三个维度的动作：&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;（1）gem 安装和调试；&lt;/li&gt;
&lt;li&gt;（2）增删改查 的功能； &lt;/li&gt;
&lt;li&gt;（3）评论功能 的调试；&lt;/li&gt;
&lt;li&gt;（4）样式功能 的修改；&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="Github Repo:"&gt;Github Repo:&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://github.com/shenzhoudance/demo_blog" rel="nofollow" target="_blank"&gt;https://github.com/shenzhoudance/demo_blog&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="demo_blog 的最终效果"&gt;demo_blog 的最终效果&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://ws1.sinaimg.cn/large/006tNc79gy1fpsle85n6oj31kw0twtbo.jpg" title="" alt="image"&gt;
&lt;img src="https://ws1.sinaimg.cn/large/006tNc79gy1fpsldzv9xmj31kw0omdif.jpg" title="" alt="image"&gt;
&lt;img src="https://ws1.sinaimg.cn/large/006tNc79gy1fpsldrv83oj31kw0rdq57.jpg" title="" alt="image"&gt;
&lt;img src="https://ws1.sinaimg.cn/large/006tNc79gy1fpsldmrzi9j31kw0tf417.jpg" title="" alt="image"&gt;&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd workspace
rails new demo_blog
ls
cd demo_blog
ls
git init
git status
git add .
git commit -m "initial commit"
rails server
git remote add origin https://github.com/shenzhoudance/demo_blog.git
git push -u origin master
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://ws4.sinaimg.cn/large/006tNc79gy1fpre75f7c0j317w0me0yi.jpg" title="" alt="image"&gt;
&lt;img src="https://ws1.sinaimg.cn/large/006tNc79gy1fpre47c21ej31040y0az2.jpg" title="" alt="image"&gt;&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git checkout -b gem
https://rubygems.org/
gem 'better_errors', '~&amp;gt; 2.4'
gem 'bulma-rails', '~&amp;gt; 0.6.2'
gem 'simple_form', '~&amp;gt; 3.5', '&amp;gt;= 3.5.1'
---
group :development do
---
gem 'guard', '~&amp;gt; 2.14', '&amp;gt;= 2.14.2'
gem 'guard-livereload', '~&amp;gt; 2.5', '&amp;gt;= 2.5.2'
---
bundle install
git add .
git commit -m "add gems"
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href="https://bulma.io/documentation/overview/start/" rel="nofollow" target="_blank"&gt;https://bulma.io/documentation/overview/start/&lt;/a&gt;
&lt;a href="https://github.com/guard/guard-livereload" rel="nofollow" target="_blank"&gt;https://github.com/guard/guard-livereload&lt;/a&gt;
&lt;a href="http://livereload.com/extensions/" rel="nofollow" target="_blank"&gt;http://livereload.com/extensions/&lt;/a&gt;&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;rails generate simple_form:install
gem 'guard-livereload', '~&amp;gt; 2.5', '&amp;gt;= 2.5.2', require: false
bundle
rails s
bundle exec guard
exit
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://ws2.sinaimg.cn/large/006tNc79ly1fpsbhgsktij313207wmza.jpg" title="" alt="image"&gt;
&lt;img src="https://ws4.sinaimg.cn/large/006tNc79ly1fpsbfs8wjmj31kw0p87d6.jpg" title="" alt="image"&gt;
&lt;img src="https://ws4.sinaimg.cn/large/006tNc79ly1fpsbgpxuv6j31hw0rq45t.jpg" title="" alt="image"&gt;&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git status
git add .
git commit -m "add gems"
git push origin gem
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://ws4.sinaimg.cn/large/006tNc79ly1fpsbjx835fj31b80vgjyp.jpg" title="" alt="image"&gt;&lt;/p&gt;
&lt;h2 id="Github 上传方法"&gt;Github 上传方法&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://ws3.sinaimg.cn/large/006tNc79ly1fpsbmo5v3bj31kw0rx0zk.jpg" title="" alt="image"&gt;
&lt;img src="https://ws3.sinaimg.cn/large/006tNc79ly1fpsbmjwlqgj31800qydjc.jpg" title="" alt="image"&gt;
&lt;img src="https://ws3.sinaimg.cn/large/006tNc79ly1fpsbmfh6rxj31960sgjx2.jpg" title="" alt="image"&gt;
&lt;img src="https://ws2.sinaimg.cn/large/006tNc79ly1fpsbm8x3bvj318w0sktee.jpg" title="" alt="image"&gt;&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;rails g controller --help
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://ws4.sinaimg.cn/large/006tNc79ly1fpsbu2iq0rj314k10sagy.jpg" title="" alt="image"&gt;&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git checkout -b posts
---
rails g controller posts

rails g model Post title:string content:text
rake db:migrate

recources :posts
root 'posts#index'

index.html.erb
show.html.erb
new.html.erb
edit.html.erb
_form.html.erb

---
app/assets/stylesheets/application.scss
@import "bulma";
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://ws1.sinaimg.cn/large/006tNc79gy1fpsd0phf70j30v009qaar.jpg" title="" alt="image"&gt;
&lt;img src="https://ws1.sinaimg.cn/large/006tNc79gy1fpsd17beltj30ic07674n.jpg" title="" alt="image"&gt;&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;app/controllers/posts_controller.rb
---
class PostsController &amp;lt; ApplicationController
   def index
     @post = Post.all.order("created_at DESC")
  end

  def new
    @post = Post.new
  end

  def create
    @post = Post.new(post_params)

    if @post.save
      redirect_to @post
    else
      render 'new'
    end
  end

  def show
    @post = Post.find(params[:id])
end

 def update
   @post = Post.find(params[:id])

   if @post.update(post_params)
     redirect_to @post
   else
     render 'edit'
   end
 end

 def edit
  @post = Post.find(params[:id])
 end

 def destroy
   @post = Post.find(params[:id])
   @post.destroy
   redirect_to root_path
 end

  private

  def post_params
    params.require(:post).permit(:title, :content)
 end
end
---
app/views/posts/_form.html.erb
---
&amp;lt;%= simple_form_for @post do |f| %&amp;gt;
&amp;lt;%=f.input :title %&amp;gt;
&amp;lt;%=f.input :content %&amp;gt;
&amp;lt;%=f.button :submit %&amp;gt;
&amp;lt;% end %&amp;gt;
---
app/views/posts/new.html.erb
---
&amp;lt;h1&amp;gt;New Post&amp;lt;/h1&amp;gt;
&amp;lt;%= render 'form' %&amp;gt;

---
app/views/posts/show.html.erb
---
&amp;lt;h1&amp;gt;&amp;lt;%= @post.title %&amp;gt;&amp;lt;/h1&amp;gt;
&amp;lt;p&amp;gt;&amp;lt;%= @post.content %&amp;gt;&amp;lt;/p&amp;gt;

&amp;lt;%= link_to "Home", root_path, class: "button" %&amp;gt;
&amp;lt;%= link_to "Edit", edit_post_path(@post), class: "button" %&amp;gt;
&amp;lt;%= link_to "Delete", post_path(@post), method: :delete, data: { confirm: "are you sure? " }, class: "button" %&amp;gt;


---
app/views/posts/index.html.erb
---
&amp;lt;% @post.each do |post| %&amp;gt;
&amp;lt;h1&amp;gt;&amp;lt;%= link_to post.title, post %&amp;gt;&amp;lt;/h1&amp;gt;
&amp;lt;p&amp;gt;&amp;lt;%= post.content %&amp;gt;&amp;lt;p&amp;gt;
&amp;lt;% end %&amp;gt;

&amp;lt;p&amp;gt;&amp;lt;%= link_to "New Post", new_post_path %&amp;gt;&amp;lt;p&amp;gt;

&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="post 的最终效果"&gt;post 的最终效果&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://ws4.sinaimg.cn/large/006tNc79ly1fpsipe1f85j30s20acq41.jpg" title="" alt="image"&gt;
&lt;img src="https://ws4.sinaimg.cn/large/006tNc79ly1fpsiorwjcbj30p60ckdgk.jpg" title="" alt="image"&gt;
&lt;img src="https://ws4.sinaimg.cn/large/006tNc79ly1fpsip5qecsj30u00aw0tx.jpg" title="" alt="image"&gt;
&lt;img src="https://ws1.sinaimg.cn/large/006tNc79ly1fpsip0wzz9j30p80by75d.jpg" title="" alt="image"&gt;&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git status
git add .
git commit -m "add post CRUD"
git push origin posts
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="comment 评论功能构建"&gt;comment 评论功能构建&lt;/h2&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git checkout -b comment
rails g controller comments
rails g model Comment name:string comment:text
rake db:migrate


rails g migration AddPostIdToComments
---
db/migrate/20180328064613_add_post_id_to_comments.rb
---
class AddPostIdToComments &amp;lt; ActiveRecord::Migration[5.1]
  def change
    add_column :comments, :post_id, :integer
  end
end
---
rake db:migrate
---
&lt;/code&gt;&lt;/pre&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;app/models/comment.rb
---
class Comment &amp;lt; ApplicationRecord
  belongs_to :post
end
---
app/models/post.rb
---
class Post &amp;lt; ApplicationRecord
  has_many :comments
end
---
&lt;/code&gt;&lt;/pre&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;config/routes.rb
---
Rails.application.routes.draw do
 resources :posts do
   resources :comments
  end

 root 'posts#index'
end
---

app/controllers/comments_controller.rb
---
class CommentsController &amp;lt; ApplicationController

  def create
    @post = Post.find(params[:post_id])
    @comment = @post.comments.create(params[:comment].permit(:name, :comment))
    redirect_to post_path(@post)

end

def destroy
  @post = Post.find(params[:post_id])
  @comment = @post.comments.find(params[:id])
  @comment.destroy
  redirect_to post_path(@post)
end

end
---
app/views/comments/_from.html.erb
---
&amp;lt;%= simple_form_for([@post, @post.comments.build]) do |f| %&amp;gt;
&amp;lt;%=f.input :name %&amp;gt;
&amp;lt;%=f.input :comment %&amp;gt;
&amp;lt;%=f.button :submit %&amp;gt;
&amp;lt;% end %&amp;gt;
---


app/views/comments/_comment.html.erb
---
&amp;lt;p&amp;gt;
  &amp;lt;%= comment.name %&amp;gt;:
  &amp;lt;%= comment.comment %&amp;gt;
&amp;lt;/p&amp;gt;

&amp;lt;%= link_to 'Delete', [comment.post, comment],
               method: :delete, class: "button is-danger", data: { confirm: 'Are you sure?' } %&amp;gt;
---

app/views/posts/show.html.erb
---
&amp;lt;h1&amp;gt;&amp;lt;%= @post.title %&amp;gt;&amp;lt;/h1&amp;gt;
&amp;lt;p&amp;gt;&amp;lt;%= @post.content %&amp;gt;&amp;lt;/p&amp;gt;

&amp;lt;%= link_to "Home", root_path, class: "button" %&amp;gt;
&amp;lt;%= link_to "Edit", edit_post_path(@post), class: "button" %&amp;gt;
&amp;lt;%= link_to "Delete", post_path(@post), method: :delete, data: { confirm: "are you sure? " }, class: "button" %&amp;gt;


&amp;lt;p&amp;gt;&amp;lt;%= @post.comments.count %&amp;gt; Comments&amp;lt;/p&amp;gt;

&amp;lt;%= render @post.comments %&amp;gt;
&amp;lt;p&amp;gt;leave a reply&amp;lt;/p&amp;gt;
&amp;lt;%= render 'comments/from' %&amp;gt;
---
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="comment 的最终效果"&gt;comment 的最终效果&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://ws2.sinaimg.cn/large/006tNc79gy1fpskiobs7lj30ms0a2q3q.jpg" title="" alt="image"&gt;
&lt;img src="https://ws2.sinaimg.cn/large/006tNc79gy1fpski68p8ej30oi0nedhm.jpg" title="" alt="image"&gt;&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;rails console
2.3.1 :001 &amp;gt; @post = Post
2.3.1 :002 &amp;gt; @Post.connection
2.3.1 :003 &amp;gt; @post.connection
2.3.1 :004 &amp;gt; @post.all
2.3.1 :005 &amp;gt; @post = Post.find(3)
2.3.1 :006 &amp;gt; @post
2.3.1 :007 &amp;gt; @post.title = "this is a nice to you!"
2.3.1 :008 &amp;gt; @post.save
2.3.1 :009 &amp;gt; exit
---
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://ws4.sinaimg.cn/large/006tNc79gy1fpsk9co0rmj31kw0lcaku.jpg" title="" alt="image"&gt;
&lt;img src="https://ws1.sinaimg.cn/large/006tNc79gy1fpsk97cwqjj31kw0jlgtu.jpg" title="" alt="image"&gt;&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git status
git add .
git commit -m "add comment to post"
git push origin comment
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://ws4.sinaimg.cn/large/006tNc79gy1fpskmt270uj31cs0te467.jpg" title="" alt="image"&gt;&lt;/p&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;git checkout -b layouts-css
---
app/views/layouts/application.html.erb
---
&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;DemoBlog&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;csrf_meta_tags&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;stylesheet_link_tag&lt;/span&gt;    &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="na"&gt;application&lt;/span&gt;&lt;span class="err"&gt;',&lt;/span&gt; &lt;span class="na"&gt;media:&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="na"&gt;all&lt;/span&gt;&lt;span class="err"&gt;',&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="na"&gt;data-turbolinks-track&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="na"&gt;:&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="na"&gt;reload&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;javascript_include_tag&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="na"&gt;application&lt;/span&gt;&lt;span class="err"&gt;',&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="na"&gt;data-turbolinks-track&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="na"&gt;:&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="na"&gt;reload&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;section&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"hero is-primary is-medium"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="c"&gt;&amp;lt;!-- Hero head: will stick at the top --&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"hero-head"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;nav&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"navbar"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"container"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"navbar-brand"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
              &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;link_to&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="na"&gt;Demo&lt;/span&gt; &lt;span class="na"&gt;Blog&lt;/span&gt;&lt;span class="err"&gt;',&lt;/span&gt; &lt;span class="na"&gt;root_path&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;class:&lt;/span&gt; &lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="na"&gt;navbar-item&lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
              &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"navbar-burger burger"&lt;/span&gt; &lt;span class="na"&gt;data-target=&lt;/span&gt;&lt;span class="s"&gt;"navbarMenuHeroA"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
              &lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"navbarMenuHeroA"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"navbar-menu"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
              &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"navbar-end"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;link_to&lt;/span&gt; &lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="na"&gt;Create&lt;/span&gt; &lt;span class="na"&gt;New&lt;/span&gt; &lt;span class="na"&gt;Post&lt;/span&gt;&lt;span class="err"&gt;",&lt;/span&gt; &lt;span class="na"&gt;new_post_path&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;class:&lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="na"&gt;navbar-item&lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
              &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
          &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/nav&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

      &lt;span class="c"&gt;&amp;lt;!-- Hero content: will be in the middle --&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"hero-body"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"container has-text-centered"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="nt"&gt;&amp;lt;h1&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"title"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;yield&lt;/span&gt; &lt;span class="na"&gt;:page_title&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/section&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;yield&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
---
app/views/posts/_form.html.erb
---
&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"section"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;simple_form_for&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="na"&gt;post&lt;/span&gt; &lt;span class="na"&gt;do&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt;&lt;span class="na"&gt;f&lt;/span&gt;&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"field"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"control"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;f.input&lt;/span&gt; &lt;span class="na"&gt;:title&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;input_html:&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt; &lt;span class="na"&gt;class:&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="na"&gt;input&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt; &lt;span class="err"&gt;},&lt;/span&gt; &lt;span class="na"&gt;wrapper:&lt;/span&gt; &lt;span class="na"&gt;false&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;label_html:&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt; &lt;span class="na"&gt;class:&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt; &lt;span class="err"&gt;}&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"field"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"control"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;f.input&lt;/span&gt; &lt;span class="na"&gt;:content&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;input_html:&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt; &lt;span class="na"&gt;class:&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="na"&gt;textarea&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt; &lt;span class="err"&gt;},&lt;/span&gt; &lt;span class="na"&gt;wrapper:&lt;/span&gt; &lt;span class="na"&gt;false&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;label_html:&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt; &lt;span class="na"&gt;class:&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt; &lt;span class="err"&gt;}&lt;/span&gt;  &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;f.button&lt;/span&gt; &lt;span class="na"&gt;:submit&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;class:&lt;/span&gt; &lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="na"&gt;button&lt;/span&gt; &lt;span class="na"&gt;is-primary&lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt; &lt;span class="na"&gt;end&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
---
app/views/posts/edit.html.erb
---
&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt; &lt;span class="na"&gt;content_for&lt;/span&gt; &lt;span class="na"&gt;:page_title&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="na"&gt;Edit&lt;/span&gt; &lt;span class="na"&gt;Post&lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;render&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="na"&gt;form&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
---
app/views/posts/new.html.erb
---
&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt; &lt;span class="na"&gt;content_for&lt;/span&gt; &lt;span class="na"&gt;:page_title&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="na"&gt;Create&lt;/span&gt; &lt;span class="na"&gt;a&lt;/span&gt; &lt;span class="na"&gt;new&lt;/span&gt; &lt;span class="na"&gt;post&lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;render&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="na"&gt;form&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
---
app/views/posts/show.html.erb
---
&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt; &lt;span class="na"&gt;content_for&lt;/span&gt; &lt;span class="na"&gt;:page_title&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="na"&gt;post.title&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;section&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"section"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"container"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;nav&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"level"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="c"&gt;&amp;lt;!-- Left side --&amp;gt;&lt;/span&gt;
          &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"level-left"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;p&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"level-item"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;strong&amp;gt;&lt;/span&gt;Actions&lt;span class="nt"&gt;&amp;lt;/strong&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
          &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
          &lt;span class="c"&gt;&amp;lt;!-- Right side --&amp;gt;&lt;/span&gt;
          &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"level-right"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;p&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"level-item"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;link_to&lt;/span&gt; &lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="na"&gt;Edit&lt;/span&gt;&lt;span class="err"&gt;",&lt;/span&gt; &lt;span class="na"&gt;edit_post_path&lt;/span&gt;&lt;span class="err"&gt;(@&lt;/span&gt;&lt;span class="na"&gt;post&lt;/span&gt;&lt;span class="err"&gt;),&lt;/span&gt; &lt;span class="na"&gt;class:&lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="na"&gt;button&lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;p&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"level-item"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;link_to&lt;/span&gt; &lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="na"&gt;Delete&lt;/span&gt;&lt;span class="err"&gt;",&lt;/span&gt; &lt;span class="na"&gt;post_path&lt;/span&gt;&lt;span class="err"&gt;(@&lt;/span&gt;&lt;span class="na"&gt;post&lt;/span&gt;&lt;span class="err"&gt;),&lt;/span&gt; &lt;span class="na"&gt;method:&lt;/span&gt; &lt;span class="na"&gt;:delete&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;data:&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt; &lt;span class="na"&gt;confirm:&lt;/span&gt; &lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="na"&gt;Are&lt;/span&gt; &lt;span class="na"&gt;you&lt;/span&gt; &lt;span class="na"&gt;sure&lt;/span&gt;&lt;span class="err"&gt;?"&lt;/span&gt; &lt;span class="err"&gt;},&lt;/span&gt; &lt;span class="na"&gt;class:&lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="na"&gt;button&lt;/span&gt; &lt;span class="na"&gt;is-danger&lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
          &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/nav&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;hr/&amp;gt;&lt;/span&gt;

        &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"content"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="na"&gt;post.content&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/section&amp;gt;&lt;/span&gt;


&lt;span class="nt"&gt;&amp;lt;section&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"section comments"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"container"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;h2&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"subtitle is-5"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;strong&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="na"&gt;post.comments.count&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/strong&amp;gt;&lt;/span&gt; Comments&lt;span class="nt"&gt;&amp;lt;/h2&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;render&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="na"&gt;post.comments&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"comment-form"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;hr&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;h3&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"subtitle is-3"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Leave a reply&lt;span class="nt"&gt;&amp;lt;/h3&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;render&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="na"&gt;comments&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="na"&gt;from&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/section&amp;gt;&lt;/span&gt;

---
app/views/posts/index.html.erb
---
&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt; &lt;span class="na"&gt;content_for&lt;/span&gt; &lt;span class="na"&gt;:page_title&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;  &lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="na"&gt;Index&lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"section"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"container"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="na"&gt;posts.each&lt;/span&gt; &lt;span class="na"&gt;do&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt;&lt;span class="na"&gt;post&lt;/span&gt;&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"card"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"card-content"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"media"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
              &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"media-content"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;p&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"title is-4"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;link_to&lt;/span&gt; &lt;span class="na"&gt;post.title&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;post&lt;/span&gt;  &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
              &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"content"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;post.content&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"comment-count"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"tag is-rounded"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;post.comments.count&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt; comments&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
          &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt; &lt;span class="na"&gt;end&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
---

app/views/comments/_comment.html.erb
---
&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"box"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;article&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"media"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"media-content"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"content"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;
          &lt;span class="nt"&gt;&amp;lt;strong&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;comment.name&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;:&lt;span class="nt"&gt;&amp;lt;/strong&amp;gt;&lt;/span&gt;
          &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;comment.comment&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
     &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;link_to&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="na"&gt;Delete&lt;/span&gt;&lt;span class="err"&gt;',&lt;/span&gt; &lt;span class="err"&gt;[&lt;/span&gt;&lt;span class="na"&gt;comment.post&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;comment&lt;/span&gt;&lt;span class="err"&gt;],&lt;/span&gt;
                  &lt;span class="na"&gt;method:&lt;/span&gt; &lt;span class="na"&gt;:delete&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;class:&lt;/span&gt; &lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="na"&gt;button&lt;/span&gt; &lt;span class="na"&gt;is-danger&lt;/span&gt;&lt;span class="err"&gt;",&lt;/span&gt; &lt;span class="na"&gt;data:&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt; &lt;span class="na"&gt;confirm:&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="na"&gt;Are&lt;/span&gt; &lt;span class="na"&gt;you&lt;/span&gt; &lt;span class="na"&gt;sure&lt;/span&gt;&lt;span class="err"&gt;?'&lt;/span&gt; &lt;span class="err"&gt;}&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/article&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
---
app/views/comments/_from.html.erb
---
&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;simple_form_for&lt;/span&gt;&lt;span class="err"&gt;([@&lt;/span&gt;&lt;span class="na"&gt;post&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="na"&gt;post.comments.build&lt;/span&gt;&lt;span class="err"&gt;])&lt;/span&gt; &lt;span class="na"&gt;do&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt;&lt;span class="na"&gt;f&lt;/span&gt;&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"field"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"control"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;f.input&lt;/span&gt; &lt;span class="na"&gt;:name&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;input_html:&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt; &lt;span class="na"&gt;class:&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="na"&gt;input&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt; &lt;span class="err"&gt;},&lt;/span&gt; &lt;span class="na"&gt;wrapper:&lt;/span&gt; &lt;span class="na"&gt;false&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;label_html:&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt; &lt;span class="na"&gt;class:&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt; &lt;span class="err"&gt;}&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"field"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"control"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;f.input&lt;/span&gt; &lt;span class="na"&gt;:comment&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;input_html:&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt; &lt;span class="na"&gt;class:&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="na"&gt;textarea&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt; &lt;span class="err"&gt;},&lt;/span&gt; &lt;span class="na"&gt;wrapper:&lt;/span&gt; &lt;span class="na"&gt;false&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;label_html:&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt; &lt;span class="na"&gt;class:&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt; &lt;span class="err"&gt;}&lt;/span&gt;  &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%=&lt;/span&gt; &lt;span class="na"&gt;f.button&lt;/span&gt; &lt;span class="na"&gt;:submit&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="na"&gt;Leave&lt;/span&gt; &lt;span class="na"&gt;a&lt;/span&gt; &lt;span class="na"&gt;reply&lt;/span&gt;&lt;span class="err"&gt;',&lt;/span&gt; &lt;span class="na"&gt;class:&lt;/span&gt; &lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="na"&gt;button&lt;/span&gt; &lt;span class="na"&gt;is-primary&lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt; &lt;span class="na"&gt;end&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
---
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="demo_blog 的最终效果"&gt;demo_blog 的最终效果&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://ws1.sinaimg.cn/large/006tNc79gy1fpsle85n6oj31kw0twtbo.jpg" title="" alt="image"&gt;
&lt;img src="https://ws1.sinaimg.cn/large/006tNc79gy1fpsldzv9xmj31kw0omdif.jpg" title="" alt="image"&gt;
&lt;img src="https://ws1.sinaimg.cn/large/006tNc79gy1fpsldrv83oj31kw0rdq57.jpg" title="" alt="image"&gt;
&lt;img src="https://ws1.sinaimg.cn/large/006tNc79gy1fpsldmrzi9j31kw0tf417.jpg" title="" alt="image"&gt;&lt;/p&gt;</description>
      <author>xiaoweirails</author>
      <pubDate>Wed, 28 Mar 2018 16:09:34 +0800</pubDate>
      <link>https://ruby-china.org/topics/35347</link>
      <guid>https://ruby-china.org/topics/35347</guid>
    </item>
    <item>
      <title>一个 muse 教学案例的分享 (包含：功能 + 用户 + 设计 + 投票 + 部署)</title>
      <description>&lt;h2 id="才华横溢 muse 案例教学 12"&gt;才华横溢 muse 案例教学 12&lt;/h2&gt;&lt;h2 id="最后效果图"&gt;最后效果图&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://ws2.sinaimg.cn/large/006tKfTcgy1fpqfmy3n6qj31kw0krn6w.jpg" title="" alt="image"&gt;
&lt;img src="https://ws3.sinaimg.cn/large/006tKfTcgy1fpqfmi63jnj31kw0undxx.jpg" title="" alt="image"&gt;&lt;/p&gt;
&lt;h2 id="Github Repo:"&gt;Github Repo:&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://github.com/shenzhoudance/muse" rel="nofollow" target="_blank"&gt;https://github.com/shenzhoudance/muse&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="Visit this website:"&gt;Visit this website:&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://xiaoweimuse.herokuapp.com/" rel="nofollow" target="_blank"&gt;https://xiaoweimuse.herokuapp.com/&lt;/a&gt;&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd workspace
rails new muse
cd muse
git init
git commit -m "initial commit"
git remote add origin https://github.com/shenzhoudance/muse.git
git push -u origin master
&lt;/code&gt;&lt;/pre&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;atom .
rails server
http://localhost:3000/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://ws2.sinaimg.cn/large/006tKfTcgy1fpnw0fa0rej30uy0rsh3o.jpg" title="" alt="image"&gt;&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git checkout -b post
rails g model post title:string link:string description:text
rake db:migrate
git add .
git commit -m "add model post"
git push origin post
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://ws1.sinaimg.cn/large/006tKfTcgy1fpnw57nd6vj31bk0h0wi2.jpg" title="" alt="image"&gt;&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;rails g controller Posts
---
config/routes.rb
---
Rails.application.routes.draw do
  resources :posts
  root 'posts#index'
end
---
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://ws4.sinaimg.cn/large/006tKfTcgy1fpnwxsqojij311u09wjs6.jpg" title="" alt="image"&gt;&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;app/controllers/posts_controller.rb
---
class PostsController &amp;lt; ApplicationController
  def index
  end
end
---
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://ws1.sinaimg.cn/large/006tKfTcgy1fpnx04vaesj31kw0hp44e.jpg" title="" alt="image"&gt;&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;app/views/posts/index.html.erb
---
&amp;lt;h1&amp;gt;欢迎来到才华横溢的世界&amp;lt;/h1&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://ws3.sinaimg.cn/large/006tKfTcgy1fpnx26bh58j30r808kdgf.jpg" title="" alt="image"&gt;&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git checkout -b add_gem
https://rubygems.org/
---
gem 'haml', '~&amp;gt; 5.0', '&amp;gt;= 5.0.4'
gem 'simple_form', '~&amp;gt; 3.5', '&amp;gt;= 3.5.1'
gem 'paperclip', '~&amp;gt; 6.0'
---
bundle install
git status
git add .
git commit -m "add application gems and post view files"
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://ws1.sinaimg.cn/large/006tKfTcgy1fpp3ktwqsij31c20h8adl.jpg" title="" alt="image"&gt;&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;app/controllers/posts_controller.rb
---
def index
end
def show
end
def new
@post = Post.new
end
def create
@post = Post.new(post_params)
if @post.save
 redirect_to @post
else
 render 'new'
end

def edit
end

def update
end

def destroy
end

private

def find_params
end

def post_params
params.require(:post).permit(:title, :link, :description)
end
end
---
app/views/posts/_form.html.haml
---
= simple_form_for @post do |f|
    = f.input :title
    = f.input :link
    = f.input :description

    = f.button :submit
---
app/views/posts/new.html.haml
---
%h1 Add Inspiration

= render 'form'
---
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://ws1.sinaimg.cn/large/006tKfTcgy1fpp423dip1j30ou0dkgmg.jpg" title="" alt="image"&gt;&lt;/p&gt;
&lt;h2 id="添加内容不被 show 页面显示"&gt;添加内容不被 show 页面显示&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://ws3.sinaimg.cn/large/006tKfTcly1fpp49hi0faj30oi0dmgmx.jpg" title="" alt="image"&gt;
&lt;img src="https://ws2.sinaimg.cn/large/006tKfTcly1fpp49nbglnj31kw0gd7ab.jpg" title="" alt="image"&gt;&lt;/p&gt;
&lt;h2 id="显示 show 的内容"&gt;显示 show 的内容&lt;/h2&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;app/views/posts/show.html.haml
--
%h1= @post.title
%h1= @post.link
%h1= @post.description
---
app/controllers/posts_controller.rb
---
class PostsController &amp;lt; ApplicationController
  before_action :find_post, only: [:show, :edit, :update, :destroy]

  def index

  end

  def show

  end

  def new
   @post = Post.new
  end

  def create
    @post = Post.new(post_params)
    if @post.save
    redirect_to @post
    else
    render 'new'
  end
end

  def edit
  end

  def update
  end

  def destroy
  end

  private

  def find_post
    @post = Post.find(params[:id])
  end

  def post_params
    params.require(:post).permit(:title, :link, :description)
  end
end
---
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://ws2.sinaimg.cn/large/006tKfTcly1fpp4mwslgzj31080d8q4r.jpg" title="" alt="image"&gt;&lt;/p&gt;
&lt;h2 id="首页页面呈现效果"&gt;首页页面呈现效果&lt;/h2&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;app/views/posts/index.html.haml
---
- @posts.each do |post|
  %h2= link_to post.title, post

= link_to "add posts", new_post_path
---
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://ws3.sinaimg.cn/large/006tKfTcly1fpp51g7tasj31bc0cwac8.jpg" title="" alt="image"&gt;&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;app/controllers/posts_controller.rb
---
def index
        @posts = Post.all.order("created_at DESC")
    end
---

app/views/posts/show.html.haml
---
%h1= @post.title
%h1= @post.link
%h1= @post.description

= link_to "home", root_path
= link_to "edit", edit_post_path(@post)
= link_to "Delete", post_path(@post), method: :delete, data: { confirm: "Are you sure?" }

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://ws4.sinaimg.cn/large/006tKfTcly1fpp5h200bqj30oi0dmgmx.jpg" title="" alt="image"&gt;
&lt;img src="https://ws3.sinaimg.cn/large/006tKfTcly1fpp5h3k7kjj30m40emabi.jpg" title="" alt="image"&gt;
&lt;img src="https://ws1.sinaimg.cn/large/006tKfTcly1fpp5h9eoj9j30mw08oaan.jpg" title="" alt="image"&gt;&lt;/p&gt;
&lt;h2 id="以上的代码的梳理，完成了基本功能的 CRUD 的构建；"&gt;以上的代码的梳理，完成了基本功能的 CRUD 的构建；&lt;/h2&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git status
git add .
git commit -m "add post CRUD"
git push origin add_gem
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://ws3.sinaimg.cn/large/006tKfTcgy1fpp61v0931j31kw0otdl6.jpg" title="" alt="image"&gt;
&lt;img src="https://ws3.sinaimg.cn/large/006tKfTcgy1fpp61wmb2sj317s0q6tcg.jpg" title="" alt="image"&gt;
&lt;img src="https://ws3.sinaimg.cn/large/006tKfTcgy1fpp61xzkxmj318a0s20yj.jpg" title="" alt="image"&gt;
&lt;img src="https://ws3.sinaimg.cn/large/006tKfTcgy1fpp61zezq0j318k0ligq6.jpg" title="" alt="image"&gt;&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git checkout -b devise
gem 'devise', '~&amp;gt; 4.4', '&amp;gt;= 4.4.3'
bundle install
rails g devise:views
rails g devise User
rake db:migrate
rails g migration add_user_id_to_post user_id:integer
rake db:migrate
---
app/models/post.rb
---
class Post &amp;lt; ApplicationRecord
  belongs_to :user
end
---
app/models/user.rb
class User &amp;lt; ApplicationRecord
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable
  has_many :posts
end
---
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://ws1.sinaimg.cn/large/006tKfTcgy1fpq0b9q4mvj31kw11048o.jpg" title="" alt="image"&gt;&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;app/controllers/posts_controller.rb
---
class PostsController &amp;lt; ApplicationController
  before_action :find_post, only: [:show, :edit, :update, :destroy]
  before_action :authenticate_user!, except: [:index, :show]
  def index
    @posts = Post.all.order("created_at DESC")
  end

  def show

  end

  def new
   @post = current_user.post.build
  end

  def create
    @post = current_user.post.build(post_params)
    if @post.save
    redirect_to @post
    else
    render 'new'
  end
end

  def edit
  end

  def update
    if @post.update(post_params)
      redirect_to @post
    else
      render 'edit'
  end
end

  def destroy
    @post.destroy
    redirect_to root_path
  end

  private

  def find_post
    @post = Post.find(params[:id])
  end

  def post_params
    params.require(:post).permit(:title, :link, :description)
  end
end
&lt;/code&gt;&lt;/pre&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;rails server
http://localhost:3000/users/sign_in
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://ws2.sinaimg.cn/large/006tKfTcgy1fpq0bjazoxj31by0egq4c.jpg" title="" alt="image"&gt;
&lt;img src="https://ws2.sinaimg.cn/large/006tKfTcgy1fpq0fxw4y6j31js0bugn9.jpg" title="" alt="image"&gt;
&lt;img src="https://ws3.sinaimg.cn/large/006tKfTcgy1fpq0fz2y4hj30ua09igmf.jpg" title="" alt="image"&gt;&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;rails c
2.3.1 :001 &amp;gt; @post = Post.last
2.3.1 :002 &amp;gt; @post = Post.last
2.3.1 :003 &amp;gt; @post = Post.first
2.3.1 :004 &amp;gt; @post.user_id = 1
2.3.1 :005 &amp;gt; @post.save
2.3.1 :006 &amp;gt; exit
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://ws4.sinaimg.cn/large/006tKfTcgy1fpq0p6kwwij31kw0ig10b.jpg" title="" alt="image"&gt;&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git status
git add .
git commit -m "add user_id &amp;amp; setuo devise"
git push origin devise
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://ws4.sinaimg.cn/large/006tKfTcgy1fpq0sj134mj318a112qcm.jpg" title="" alt="image"&gt;&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;rails g migration add_name_to_user name:string
rake db:migrate
rails g devise views
&lt;/code&gt;&lt;/pre&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;app/views/devise/registrations/edit.html.erb
---
&amp;lt;div class="form-inputs"&amp;gt;
  &amp;lt;%= f.input :name, required: true, autofocus: true %&amp;gt;
  &amp;lt;%= f.input :email, required: true %&amp;gt;
---
app/views/devise/registrations/new.html.erb
---
&amp;lt;div class="form-inputs"&amp;gt;
  &amp;lt;%= f.input :name, required: true, autofocus: true %&amp;gt;
  &amp;lt;%= f.input :email, required: true %&amp;gt;
  &amp;lt;%= f.input :password, required: true, hint: ("#{@minimum_password_length} characters minimum" if @minimum_password_length) %&amp;gt;
  &amp;lt;%= f.input :password_confirmation, required: true %&amp;gt;
&amp;lt;/div&amp;gt;
---
app/controllers/application_controller.rb
---
https://stackoverflow.com/questions/37341967/rails-5-undefined-method-for-for-devise-on-line-devise-parameter-sanitizer
---
class ApplicationController &amp;lt; ActionController::Base
  protect_from_forgery with: :exception

   before_action :configure_permitted_parameters, if: :devise_controller?

    protected

    def configure_permitted_parameters
      devise_parameter_sanitizer.permit(:sign_up, keys: [:username])
      devise_parameter_sanitizer.permit(:account_update, keys: [:username])
    end
 end
---
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://ws2.sinaimg.cn/large/006tKfTcly1fpq1wj68axj312e0fiwg1.jpg" title="" alt="image"&gt;
&lt;img src="https://ws1.sinaimg.cn/large/006tKfTcly1fpq1wizvgrj312a0hwgnj.jpg" title="" alt="image"&gt;&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git checkout -b paperclip
app/models/post.rb
---
class Post &amp;lt; ApplicationRecord
  belongs_to :user
  has_attached_file :image, styles: { medium: "700x500&amp;gt;", thumb: "350x250&amp;gt;" }
  validates_attachment_content_type :image, content_type: /\Aimage\/.*\z/
end
---
rails generate paperclip post image
rake db:migrate
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://ws3.sinaimg.cn/large/006tNc79gy1fpq9bf0klij31kw0g7dko.jpg" title="" alt="image"&gt;&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;app/views/posts/show.html.haml
---
%h1= @post.title
%p= @post.link
%p= @post.description
%p= @post.user.name
%p= @post.image


= link_to "home", root_path
= link_to "edit", edit_post_path(@post)
= link_to "Delete", post_path(@post), method: :delete, data: { confirm: "Are you sure?" }
---
app/controllers/posts_controller.rb
---
private

def find_post
  @post = Post.find(params[:id])
end

def post_params
  params.require(:post).permit(:title, :link, :description, :image)
end
end
---
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="本案例的关键的操作在于："&gt;本案例的关键的操作在于：&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;（1）完成基本 CRUD 的基本功能；（model + controller + views + routes）&lt;/li&gt;
&lt;li&gt;（2）完成 devise + name 的使用；（这个注册页面的修改上面，还需要强化认知；）
&lt;a href="http://xbearx1987-blog.logdown.com/posts/1707961-how-to-devise-new-name-field-and-administrator-rights" rel="nofollow" target="_blank"&gt;http://xbearx1987-blog.logdown.com/posts/1707961-how-to-devise-new-name-field-and-administrator-rights&lt;/a&gt;
```
Devise 4 的参数 Sanitaizer API 已更改&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;class ApplicationController &amp;lt; ActionController::Base
  before_action :configure_permitted_parameters, if: :devise_controller?&lt;/p&gt;

&lt;p&gt;protected&lt;/p&gt;

&lt;p&gt;def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up, keys: [:username])
  end
end&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- （3）完成 图片 栏位的使用；gem paperclip（这个图片上传的 gem 需要使用最新的上传功能）
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="app/views/posts/_form.html.haml"&gt;app/views/posts/_form.html.haml&lt;/h2&gt;
&lt;p&gt;= simple_form_for &lt;a href="/post" class="user-mention" title="@post"&gt;&lt;i&gt;@&lt;/i&gt;post&lt;/a&gt; do |f|
    = f.input :image
    = f.input :title
    = f.input :link
    = f.input :description&lt;/p&gt;
&lt;h2 id="= f.button :submit"&gt;    = f.button :submit&lt;/h2&gt;&lt;h2 id="app/views/posts/show.html.haml"&gt;app/views/posts/show.html.haml&lt;/h2&gt;
&lt;p&gt;= image_tag &lt;a href="/post.image.url" class="user-mention" title="@post.image.url"&gt;&lt;i&gt;@&lt;/i&gt;post.image.url&lt;/a&gt;(:medium)
%h1= &lt;a href="/post.title" class="user-mention" title="@post.title"&gt;&lt;i&gt;@&lt;/i&gt;post.title&lt;/a&gt;
%p= &lt;a href="/post.link" class="user-mention" title="@post.link"&gt;&lt;i&gt;@&lt;/i&gt;post.link&lt;/a&gt;
%p= &lt;a href="/post.description" class="user-mention" title="@post.description"&gt;&lt;i&gt;@&lt;/i&gt;post.description&lt;/a&gt;
%p= &lt;a href="/post.user.name" class="user-mention" title="@post.user.name"&gt;&lt;i&gt;@&lt;/i&gt;post.user.name&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;= link_to "home", root_path
= link_to "edit", edit_post_path(&lt;a href="/post" class="user-mention" title="@post"&gt;&lt;i&gt;@&lt;/i&gt;post&lt;/a&gt;)&lt;/p&gt;
&lt;h2 id="= link_to "&gt;= link_to "Delete", post_path(&lt;a href="/post" class="user-mention" title="@post"&gt;&lt;i&gt;@&lt;/i&gt;post&lt;/a&gt;), method: :delete, data: { confirm: "Are you sure?" }&lt;/h2&gt;&lt;h2 id="app/models/post.rb"&gt;app/models/post.rb&lt;/h2&gt;
&lt;p&gt;class Post &amp;lt; ApplicationRecord
  belongs_to :user
  has_attached_file :image, styles: { medium: "700x500&amp;gt;", thumb: "350x250&amp;gt;" }
  validates_attachment_content_type :image, content_type: /\Aimage\/.*\z/&lt;/p&gt;
&lt;h2 id="end"&gt;end&lt;/h2&gt;&lt;h2 id="app/views/posts/index.html.haml"&gt;app/views/posts/index.html.haml&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="/posts.each" class="user-mention" title="@posts.each"&gt;&lt;i&gt;@&lt;/i&gt;posts.each&lt;/a&gt; do |post|
= link_to (image_tag post.image.url), post
%h2= link_to post.title, post&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="= link_to "&gt;  = link_to "add posts", new_post_path&lt;/h2&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://ws4.sinaimg.cn/large/006tKfTcly1fpqalvwfuij30ng0dmab0.jpg" title="" alt="image"&gt;
&lt;img src="https://ws4.sinaimg.cn/large/006tKfTcly1fpqam397hjj30uq0rmtlo.jpg" title="" alt="image"&gt;
&lt;img src="https://ws3.sinaimg.cn/large/006tKfTcly1fpqaucz05ij30xo0wadsz.jpg" title="" alt="image"&gt;&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git status
git add .
git commit -m "add paperclip for image uploadomg"
git push origin paperclip
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;（4）完成 用户 评论的对接；&lt;/li&gt;
&lt;li&gt;（5）完成 页面 美化的调试；&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="完成 用户 评论的对接"&gt;完成 用户 评论的对接&lt;/h2&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git checkout -b comment
rails g model comment content:text post:references user:references
rake db:migrate
---
app/models/post.rb
---
class Post &amp;lt; ApplicationRecord
  belongs_to :user
  has_many :comments
  has_attached_file :image, styles: { medium: "700x500&amp;gt;", thumb: "350x250&amp;gt;" }
  validates_attachment_content_type :image, content_type: /\Aimage\/.*\z/
end
---
app/models/user.rb
---
class User &amp;lt; ApplicationRecord
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable
  has_many :posts
  has_many :comments
end
---
config/routes.rb
---
Rails.application.routes.draw do
  devise_for :views
  devise_for :users
  resources :posts do
    resources :comments
  end
  root 'posts#index'
end
---
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://ws3.sinaimg.cn/large/006tKfTcly1fpqbd1rwsnj31kw0uiqf1.jpg" title="" alt="image"&gt;&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;rails g controller comments
---
app/controllers/comments_controller.rb
---
class CommentsController &amp;lt; ApplicationController
 before_action :authenticate_user!

 def create
   @post = Post.find(params[:post_id])
   @comment = Comment.create(params[:comment].permit(:content)
   @comment.user_id = current_user.id
   @comment.post_id = @post.id

   if @comment.save
     redirect_to post_path(@post)
   else
     render 'new'
  end
 end
end
---
app/views/comments/_form.html.haml
---
= simple_form_for([@post, @post.comments.build]) do |f|
    = f.input :content, label: "Reply to thread"
    = f.button :submit, class: "button"
---
app/views/posts/show.html.haml
---
= image_tag @post.image.url(:medium)
%h1= @post.title
%p= @post.link
%p= @post.description
%p= @post.user.name

#comments
    %h2.comment_count= pluralize(@post.comments.count, "Comment")
    - @comments.each do |comment|
        .comment
            %p.username= comment.user.name
            %p.content= comment.content

    = render "comments/form"

= link_to "home", root_path
= link_to "edit", edit_post_path(@post)
= link_to "Delete", post_path(@post), method: :delete, data: { confirm: "Are you sure?" }
---
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://ws2.sinaimg.cn/large/006tKfTcly1fpqc2rmwbgj30uq0v6wrj.jpg" title="" alt="image"&gt;&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;app/views/posts/index.html.haml
---
- @posts.each do |post|
  = link_to (image_tag post.image.url), post
  %h2= link_to post.title, post
  %p
  = post.comments.count
  Comments

%h2= link_to "add posts", new_post_path, class: "button"
---
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://ws4.sinaimg.cn/large/006tKfTcgy1fpqckld8rtj30to0xitlv.jpg" title="" alt="image"&gt;
&lt;img src="https://ws3.sinaimg.cn/large/006tKfTcgy1fpqck30kksj30um0ymank.jpg" title="" alt="image"&gt;&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git status
git add .
git commit -m "add comment to posts"
git push origin comment
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://ws3.sinaimg.cn/large/006tKfTcgy1fpqcngnzikj31a80uudnb.jpg" title="" alt="image"&gt;&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git checkout -b acts_as_votable
https://rubygems.org/gems/acts_as_votable
gem 'acts_as_votable', '~&amp;gt; 0.11.1'
bundle install
rails generate acts_as_votable:migration
rake db:migrate
---
app/models/post.rb
---
class Post &amp;lt; ApplicationRecord
  acts_as_votable
  belongs_to :user
  has_many :comments
  has_attached_file :image, styles: { medium: "700x500&amp;gt;", thumb: "350x250&amp;gt;" }
  validates_attachment_content_type :image, content_type: /\Aimage\/.*\z/
end
---
config/routes.rb
---
Rails.application.routes.draw do
  devise_for :views
  devise_for :users
  resources :posts do
    member do
    put 'like', to: "posts#upvote"
    put 'dislike', to: "posts#downvote"
    end
    resources :comments
  end
  root 'posts#index'
end
---
app/controllers/posts_controller.rb
---
class PostsController &amp;lt; ApplicationController
  before_action :find_post, only: [:show, :edit, :update, :destroy, :upvote, :downvote]
  before_action :authenticate_user!, except: [:index, :show]
  def index
    @posts = Post.all.order("created_at DESC")
  end

  def show
    @comments = Comment.where(post_id: @post)
  end

  def new
   @post = current_user.posts.build
  end

  def create
    @post = current_user.posts.build(post_params)
    if @post.save
    redirect_to @post
    else
    render 'new'
  end
end

  def edit
  end

  def update
    if @post.update(post_params)
      redirect_to @post
    else
      render 'edit'
  end
end

  def destroy
    @post.destroy
    redirect_to root_path
  end

  def upvote
  @post.upvote_by current_user
  redirect_back fallback_location: root_path
end

def downvote
  @post.downvote_from current_user
  redirect_back fallback_location: root_path
end

  private

  def find_post
    @post = Post.find(params[:id])
  end

  def post_params
    params.require(:post).permit(:title, :link, :description, :image)
  end
end
---
app/views/posts/index.html.haml
---
- @posts.each do |post|
  = link_to (image_tag post.image.url), post
  %h2= link_to post.title, post
  %p
  = post.comments.count
  Comments
  %p
    = post.get_likes.size
    Likes

%h2= link_to "add posts", new_post_path, class: "button"
---
app/views/posts/show.html.haml
---
= image_tag @post.image.url(:medium)
%h1= @post.title
%p= @post.link
%p= @post.description
%p= @post.user.name
%p= @post.get_upvotes.size
%p= @post.get_downvotes.size
= link_to "like", like_post_path(@post), method: :get
= link_to "dislike", dislike_post_path(@post), method: :get



#comments
    %h2.comment_count= pluralize(@post.comments.count, "Comment")
    - @comments.each do |comment|
        .comment
            %p.username= comment.user.name
            %p.content= comment.content

    = render "comments/form"

= link_to "home", root_path
= link_to "edit", edit_post_path(@post)
= link_to "Delete", post_path(@post), method: :delete, data: { confirm: "Are you sure?" }
---
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://ws3.sinaimg.cn/large/006tKfTcgy1fpqe5rvujcj30tm0pan94.jpg" title="" alt="image"&gt;
&lt;img src="https://ws1.sinaimg.cn/large/006tKfTcgy1fpqe5gbqddj30z00w410n.jpg" title="" alt="image"&gt;&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git status
git add .
git commit -m "add index show &amp;amp; setup voting"
git push origin acts_as_votable
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://ws4.sinaimg.cn/large/006tKfTcgy1fpqe9yxgraj31c20usdni.jpg" title="" alt="image"&gt;&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git checkout -b layouts-scss
app/views/layouts/application.html.haml
---
!!!
%html
%head
    %title Muse
    = stylesheet_link_tag    'application', media: 'all'
    = javascript_include_tag 'application'
    %link{:rel =&amp;gt; "stylesheet", :href =&amp;gt; "http://cdnjs.cloudflare.com/ajax/libs/normalize/3.0.1/normalize.min.css"}
    %link{:rel =&amp;gt; "stylesheet", :href =&amp;gt; "http://maxcdn.bootstrapcdn.com/font-awesome/4.2.0/css/font-awesome.min.css"}
    = csrf_meta_tags
%body
    %header
        .wrapper.clearfix
            #logo= link_to "Muse", root_path
            %nav
                - if user_signed_in?
                    = link_to "current_user.name", edit_user_registration_path, class: "button"
                    = link_to "Add New Inspiration", new_post_path, class: "button"
                - else
                    = link_to "Sign in", new_user_session_path
                    = link_to "Sign Up", new_user_registration_path, class: "button"
    %p.notice= notice
    %p.alert= alert
    .wrapper
        = yield
---
app/assets/stylesheets/application.css.scss
---
/*
 *= require_self
 */

body {
    font-family: "Proxima Nova";
    font-weight: 100;
}

h1, h2, h3, h4, h5, h6 {
    font-weight: 100;
}

.wrapper {
    width: 80%;
    margin: 0 auto;
}

.clearfix:before, .clearfix:after {
    content: " ";
    display: table;
}

.clearfix:after {
    clear: both;
}

.button {
    border: 1px solid #9B9B9B;
    padding: .7rem 1.25rem;
    border-radius: .3rem;
    outline: none;
    background: white;
    color: #9B9B9B;
}

header {
    width: 100%;
    padding: 2rem 0;
    border-bottom: 1px solid #E4E4E4;
    #logo {
        float: left;
        font-size: 1.75rem;
        a {
            color: #333233;
            text-decoration: none;
            &amp;amp;:hover {
                color: #50A7C7;
            }
        }
    }
    nav {
        float: right;
        a {
            margin-left: 1.5rem;
            line-height: 2;
            color: #9B9B9B;
            text-decoration: none;
            &amp;amp;:hover {
                color: #50A7C7;
            }
        }
    }
}

@import 'home.css.scss';
@import 'post.css.scss';
app/assets/stylesheets/home.css.scss
---

#intro {
    margin: 2.75rem 0 1.75rem 0;
    text-align: center;
    font-size: 1.75rem;
    line-height: 1;
    span {
        font-size: 1.25rem;
        color: #9B9B9B;
    }
}
#posts {
    .post {
        background: #F8F9FA;
        width: 30%;
        float: left;
        margin: 1rem 1.5%;
        border: 1px solid #E4E4E4;
        border-radius: 0.3rem;
        .post_image {
            height: 200px;
            overflow: hidden;
            img {
                width: 100%;
                border-radius: .3rem .3rem 0 0;
            }
        }
        .post_content {
            h2 {
                margin: 0;
                font-weight: 100;
                padding: 1rem 5%;
                border-bottom: 1px solid #E4E4E4;
                font-size: 1.25rem;
                a {
                    text-decoration: none;
                    color: #333233;
                    &amp;amp;:hover {
                        color: #50A7C7;
                    }
                }
            }
            .data {
                padding: .75rem 5%;
                color: #969696;
                .username, .buttons {
                    margin: 0;
                    font-size: .8rem;
                }
                .username {
                    float: left;
                }
                .buttons {
                    float: right;
                    span {
                        margin-left: .5rem;
                    }
                }
            }
        }
    }
}
---
app/assets/stylesheets/post.css.scss
---
#post_show {
    padding-top: 2rem;
    .post_image_description {
        width: 50%;
        float: left;
        margin-right: 5%;
    }
    .post_data {
        width: 15%;
        float: left;
        .button {
            width: 100%;
            display: inline-block;
            padding: .75rem 0;
            margin-bottom: 1rem;
            text-align: center;
            text-decoration: none;
            color: #969696;
            &amp;amp;:hover {
                color: #50A7C7;
                border: 1px solid #50A7C7;
            }
        }
        .data {
            width: 100%;
            display: block;
            padding: .75rem 0;
            border-bottom: 1px solid #E9E9E9;
            text-decoration: none;
            color: #969696;
            margin: 0;
        }
    }
    #random_post {
        width: 25%;
        margin-left: 5%;
        margin-top: -3.2rem;
        float: left;
        h3 {
            font-size: 1rem;
        }
        .post {
            background: #F8F9FA;
            border: 1px solid #E4E4E4;
            border-radius: 0.3rem;
            .post_image {
                height: 200px;
                overflow: hidden;
                img {
                    width: 100%;
                    border-radius: .3rem .3rem 0 0;
                }
            }
            .post_content {
                h2 {
                    margin: 0;
                    font-weight: 100;
                    padding: 1rem 5%;
                    border-bottom: 1px solid #E4E4E4;
                    font-size: 1.25rem;
                    a {
                        text-decoration: none;
                        color: #333233;
                        &amp;amp;:hover {
                            color: #50A7C7;
                        }
                    }
                }
                .data {
                    padding: .75rem 5%;
                    color: #969696;
                    .username, .buttons {
                        margin: 0;
                        font-size: .8rem;
                    }
                    .username {
                        float: left;
                    }
                    .buttons {
                        float: right;
                        span {
                            margin-left: .5rem;
                        }
                    }
                }
            }
        }
    }
    h1 {
        margin: 0;
        color: #333233;
    }
    img {
        width: 100%;
        border-radius: .3rem;
    }
    .username {
        color: #969696;
        margin: 0 0 1.5rem 0;
    }
    .description {
        margin: 2rem 0;
        font-size: 1.1rem;
        line-height: 1.5;
        color: #969696;
    }
}

#comments {
    padding-bottom: 4rem;
    width: 50%;
    .comment_count {
        border-bottom: 1px solid #E9E9E9;
        padding-bottom: .5rem;
        margin-bottom: 0;
    }
    .comment {
        padding: 2rem 0;
        border-bottom: 1px solid #E9E9E9;
        padding-left: 5%;
        .username {
            font-size: 1.3rem;
            color: #333233;
            margin: 0 0 .5rem 0;
        }
        .content {
            margin: 0;
            color: #969696;
        }
    }
    .comment_content {
        margin-top: 2.5rem;
        textarea {
            width: 100%;
            margin: 1rem 0;
            min-height: 150px;
            border: 1px solid #E4E4E4;
            background: #F8F9FA;
            border-radius: 0.3rem;
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://ws3.sinaimg.cn/large/006tKfTcgy1fpqezmzawjj31k40zqtmm.jpg" title="" alt="image"&gt;
&lt;img src="https://ws1.sinaimg.cn/large/006tKfTcgy1fpqeyu51bjj31kw0xadop.jpg" title="" alt="image"&gt;&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;app/views/posts/index.html.haml
---
- if user_signed_in?
    %p#intro
        Hello
        = current_user.name
        %br/
        %span
            Share your inspiration and see what's inspiring others.
- else
    %p#intro
        What's your muse?
        %br/
        %span
            Share your inspiration and see what's inspiring others.
#posts
    - @posts.each do |post|
        .post
            .post_image
                = link_to (image_tag post.image.url), post
            .post_content
                .title
                    %h2= link_to post.title, post
                .data.clearfix
                    %p.username
                        Shared by
                        = post.user.name
                    %p.buttons
                        %span
                            %i.fa.fa-comments-o
                            = post.comments.count
                        %span
                            %i.fa.fa-thumbs-o-up
                            = post.get_likes.size
---
app/views/posts/show.html.haml
---
= image_tag @post.image.url(:medium)
%h1= @post.title
%p= @post.link
%p= @post.description
%p= @post.user.name
%p= @post.get_upvotes.size
%p= @post.get_downvotes.size
= link_to "like", like_post_path(@post), method: :get
= link_to "dislike", dislike_post_path(@post), method: :get



#comments
    %h2.comment_count= pluralize(@post.comments.count, "Comment")
    - @comments.each do |comment|
        .comment
            %p.username= comment.user.name
            %p.content= comment.content

    = render "comments/form"

= link_to "home", root_path
= link_to "edit", edit_post_path(@post)
= link_to "Delete", post_path(@post), method: :delete, data: { confirm: "Are you sure?" }
---
# 改变
---
#post_show
    %h1= @post.title
    %p.username
        Shared by
        = @post.user.name
        about
        = time_ago_in_words(@post.created_at)
    .clearfix
        .post_image_description
            = image_tag @post.image.url(:medium)
            .description= simple_format(@post.description)
        .post_data
            = link_to "Visit Link", @post.link, class: "button"
            = link_to like_post_path(@post), method: :get, class: "data" do
                %i.fa.fa-thumbs-o-up
                = pluralize(@post.get_upvotes.size, "Like")
            = link_to dislike_post_path(@post), method: :get, class: "data" do
                %i.fa.fa-thumbs-o-down
                = pluralize(@post.get_downvotes.size, "Dislike")
            %p.data
                %i.fa.fa-comments-o
                = pluralize(@post.comments.count, "Comment")
            - if @post.user == current_user
                = link_to "Edit", edit_post_path(@post), class: "data"
                = link_to "Delete", post_path(@post), method: :delete, data: { confirm: "Are you sure?" }, class: "data"
        #random_post
            %h3 Random Inspiration
            .post
                .post_image
                    = link_to (image_tag @random_post.image.url(:medium)), post_path(@random_post)
                .post_content
                    .title
                        %h2= link_to @random_post.title, post_path(@random_post)
                    .data.clearfix
                        %p.username
                            Shared by
                            = @random_post.user.name
                        %p.buttons
                            %span
                                %i.fa.fa-comments-o
                                = @random_post.comments.count
                            %span
                                %i.fa.fa-thumbs-o-up
                                = @random_post.get_likes.size

#comments
    %h2.comment_count= pluralize(@post.comments.count, "Comment")
    - @comments.each do |comment|
        .comment
            %p.username= comment.user.name
            %p.content= comment.content

    = render "comments/form"
---
app/controllers/posts_controller.rb
---
def show
  @comments = Comment.where(post_id: @post)
  @random_post = Post.where.not(id: @post).order("RANDOM()").first
end
---
app/views/posts/show.html.haml
---
#post_show
    %h1= @post.title
    %p.username
        Shared by
        = @post.user.name
        about
        = time_ago_in_words(@post.created_at)
    .clearfix
        .post_image_description
            = image_tag @post.image.url(:medium)
            .description= simple_format(@post.description)
        .post_data
            = link_to "Visit Link", @post.link, class: "button"
            = link_to like_post_path(@post), method: :get, class: "data" do
                %i.fa.fa-thumbs-o-up
                = pluralize(@post.get_upvotes.size, "Like")
            = link_to dislike_post_path(@post), method: :get, class: "data" do
                %i.fa.fa-thumbs-o-down
                = pluralize(@post.get_downvotes.size, "Dislike")
            %p.data
                %i.fa.fa-comments-o
                = pluralize(@post.comments.count, "Comment")
            - if @post.user == current_user
                = link_to "Edit", edit_post_path(@post), class: "data"
                = link_to "Delete", post_path(@post), method: :delete, data: { confirm: "Are you sure?" }, class: "data"
        #random_post
            %h3 Random Inspiration
            .post
                .post_image
                    = link_to (image_tag @random_post.image.url(:medium)), post_path(@random_post)
                .post_content
                    .title
                        %h2= link_to @random_post.title, post_path(@random_post)
                    .data.clearfix
                        %p.username
                            Shared by
                            = @random_post.user.name
                        %p.buttons
                            %span
                                %i.fa.fa-comments-o
                                = @random_post.comments.count
                            %span
                                %i.fa.fa-thumbs-o-up
                                = @random_post.get_likes.size

#comments
    %h2.comment_count= pluralize(@post.comments.count, "Comment")
    - @comments.each do |comment|
        .comment
            %p.username= comment.user.name
            %p.content= comment.content

    = render "comments/form"
---
&lt;/code&gt;&lt;/pre&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git status
git add .
git commit -m "edit show &amp;amp; index post"
git push origin layouts-scss
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="最后效果图"&gt;最后效果图&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://ws2.sinaimg.cn/large/006tKfTcgy1fpqfmy3n6qj31kw0krn6w.jpg" title="" alt="image"&gt;
&lt;img src="https://ws3.sinaimg.cn/large/006tKfTcgy1fpqfmi63jnj31kw0undxx.jpg" title="" alt="image"&gt;&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git checkout -b heroku
---
Gemfile
---
group :development, :test do
  gem 'sqlite3', '1.3.13'
  # Call 'byebug' anywhere in the code to stop execution and get a debugger console
  gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
  # Adds support for Capybara system testing and selenium driver
  gem 'capybara', '~&amp;gt; 2.13'
  gem 'selenium-webdriver'
end

group :production do
  gem 'pg', '0.20.0'
end
---
bundle install
rails server
---
git add .
git commit -a -m "Update Gemfile for Heroku"
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://ws3.sinaimg.cn/large/006tNc79ly1fpr46171vyj31kw0ru13d.jpg" title="" alt="image"&gt;&lt;/p&gt;
&lt;h2 id="heroku 云端部署"&gt;heroku 云端部署&lt;/h2&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;heroku create xiaoweimuse
git push heroku heroku:master
rake assets:clean
heroku run rake db:migrate
heroku open
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://ws4.sinaimg.cn/large/006tNc79ly1fpr44sbht0j31kw0jndm5.jpg" title="" alt="image"&gt;
&lt;img src="https://ws2.sinaimg.cn/large/006tNc79ly1fpr44nx52yj31kw0lvk0r.jpg" title="" alt="image"&gt;
&lt;img src="https://ws1.sinaimg.cn/large/006tNc79ly1fpr44c2ghlj31kw0l446w.jpg" title="" alt="image"&gt;&lt;/p&gt;</description>
      <author>xiaoweirails</author>
      <pubDate>Tue, 27 Mar 2018 08:39:06 +0800</pubDate>
      <link>https://ruby-china.org/topics/35331</link>
      <guid>https://ruby-china.org/topics/35331</guid>
    </item>
    <item>
      <title>[付费咨询] 微信支付和支付宝对接功能制作？</title>
      <description>&lt;h2 id="提问："&gt;提问：&lt;/h2&gt;
&lt;p&gt;最近公司已经完成了 微信支付 和支付宝支付的账号，在这个过程中，发现大量的信息其实是没有价值，不可以帮助我完成对于支付功能的对接，所以在这个过程中，使用付费咨询的形式完成功能的咨询。&lt;/p&gt;
&lt;h2 id="我对于当下的互联网容器的认知："&gt;我对于当下的互联网容器的认知：&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;网页端&lt;/li&gt;
&lt;li&gt;移动端&lt;/li&gt;
&lt;li&gt;微信端&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;在这三段的过程中，我们可以使用 &lt;strong&gt;Ruby on Rails&lt;/strong&gt; 完成 网页端和微信端的产品的开发，使用 &lt;strong&gt;React Native&lt;/strong&gt; 完成移动端的构建，所以其实我我们需要完成的不外乎是五个功能的构建：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;功能结构&lt;/li&gt;
&lt;li&gt;用户体系&lt;/li&gt;
&lt;li&gt;设计体系&lt;/li&gt;
&lt;li&gt;部署体系&lt;/li&gt;
&lt;li&gt;支付体系&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;在以上容器打造完毕之后，通过内容和运营完成货币的交易，所以在当下这个阶段中，我对于功能体系的认知已经逐渐的清晰，我们对于用户的结构也非常的清晰，对于页面的设计需要时间不断的打磨，对于云端部署其实已经慢慢在熟悉，现在对于支付的功能的时候，缺乏一个样板可以完成操作，所以在这个地方付费开始完成咨询；&lt;/p&gt;
&lt;h2 id="获取微信支付和支付宝支付的网页端的经验："&gt;获取微信支付和支付宝支付的网页端的经验：&lt;/h2&gt;&lt;h2 id="支付费用：1000元"&gt;支付费用：1000 元&lt;/h2&gt;
&lt;p&gt;#截止时间：2018 年 2 月 17 日 -2018 年 3 月 15 日&lt;/p&gt;

&lt;p&gt;如果你自己真实的做过支付功能，有这个信心可以教授这个技能，可以通过回复信息完成教学，需要给我看证明你实力的简历和经历的项目，完成投标；&lt;/p&gt;

&lt;p&gt;肖威
2018.02.17&lt;/p&gt;</description>
      <author>xiaoweirails</author>
      <pubDate>Sat, 17 Feb 2018 10:52:28 +0800</pubDate>
      <link>https://ruby-china.org/topics/35045</link>
      <guid>https://ruby-china.org/topics/35045</guid>
    </item>
    <item>
      <title>[北京] 2017.10.28 北京 Ruby 活动即将开始</title>
      <description>&lt;h2 id="北京 2017.10.28 Ruby 技术活动"&gt;北京 2017.10.28 Ruby 技术活动&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2017/3f513df2-bd50-4b4a-a6b1-7b4af74692ff.jpg!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2017/651c38b6-be25-4e45-a999-ab45bfa4e88b.jpg!large" title="" alt=""&gt;&lt;/p&gt;
&lt;h2 id="活动时间"&gt;活动时间&lt;/h2&gt;
&lt;p&gt;10 月 28 日 (周六) 下午 02:00 - 06:00&lt;/p&gt;
&lt;h2 id="活动地点"&gt;活动地点&lt;/h2&gt;
&lt;p&gt;北京&lt;/p&gt;
&lt;h2 id="活动简介"&gt;活动简介&lt;/h2&gt;
&lt;p&gt;10 月 21 日，上海 Go Hack 2017 即将开始，才华横溢科技（北京）有限责任公司特组队参与了本次比赛。&lt;/p&gt;

&lt;p&gt;我们将为大家带来最新的 Go Hack 的分享，希望北京的朋友们能一起聚起来，交流想法&lt;/p&gt;
&lt;h2 id="活动内容"&gt;活动内容&lt;/h2&gt;
&lt;p&gt;主持人开场白
&lt;img src="https://l.ruby-china.com/photo/2017/738405c7-3938-4e9e-b039-f385517d6cd3.png!large" title="" alt=""&gt;&lt;/p&gt;
&lt;h2 id="携带装备"&gt;携带装备&lt;/h2&gt;
&lt;p&gt;Mac 电脑&lt;/p&gt;
&lt;h2 id="报名地址"&gt;报名地址&lt;/h2&gt;
&lt;p&gt;请通过   &lt;a href="http://www.huodongxing.com/event/7409306117900" rel="nofollow" target="_blank" title=""&gt;活动行&lt;/a&gt; 完成 线上报名。&lt;/p&gt;

&lt;p&gt;担心找不到路的朋友，请记下组织者的号码：157 0158 7150 肖威
2017 年 10 月 27 日&lt;/p&gt;
&lt;h2 id="现场照片，实时直播。"&gt;现场照片，实时直播。&lt;/h2&gt;&lt;h2 id="现场直播照片地址"&gt;&lt;a href="http://www.jfoto.cn/zpzb/info/v/20171028CHHY?from=groupmessage" rel="nofollow" target="_blank" title=""&gt;现场直播照片地址&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2017/1375856d-0d76-4866-82e6-a799ee1031a6.png!large" title="" alt=""&gt;&lt;/p&gt;</description>
      <author>xiaoweirails</author>
      <pubDate>Fri, 13 Oct 2017 09:14:22 +0800</pubDate>
      <link>https://ruby-china.org/topics/34364</link>
      <guid>https://ruby-china.org/topics/34364</guid>
    </item>
    <item>
      <title>新手入门 Ruby On Rails 必备的知识体系</title>
      <description>&lt;h2 id="为什么撰写技术的文档"&gt;为什么撰写技术的文档&lt;/h2&gt;
&lt;p&gt;最近在筹备互联网的公司，在这个过程中，发现找到可以使用的人才和愿意学习的人才是一件非常困难的事情，在这个过程中，我将自己在学习 Ruby 的语言的过程和思考撰写写来，希望可以帮助想要学习 Ruby 的人少走一些弯路，同时尽可能的招募到我想要的学习型的人才。&lt;/p&gt;
&lt;h2 id="如何快速的学习Ruby"&gt;如何快速的学习 Ruby&lt;/h2&gt;
&lt;p&gt;在学习 ruby 以前最快速的方法是知道如何快速的完成 Web App 完成的规则，只有知道了一个 Web App 整个流程的体系，就可以快速的完成自己的编程的学习；我们自学习编程的过程中，最主要的学习的方式最要集中在三个方面，我将这三个方面做了下面的归纳和梳理；&lt;/p&gt;
&lt;h2 id="其中分别是：前端的架构，后端的框架，应用的部署；"&gt;其中分别是：前端的架构，后端的框架，应用的部署；&lt;/h2&gt;&lt;h2 id="第一个学习的方面：首先我们来谈一谈前端的框架"&gt;第一个学习的方面：首先我们来谈一谈前端的框架&lt;/h2&gt;
&lt;p&gt;主要使用的是 html 完成整个页面的布局，css 完成页面的服装的布局，js 主要涉及到一些动态的元素的使用，在使用前端的框架的时候，主要在完成对于盒子模型的使用，需要大量的在使用的过程中，才可以快速的掌握其中的核心要求和要领，在这个过程中，12vs12 的 landing page 的制作的方法，给与了非常好的借鉴意义；在这个前端使用的过程中，我们最应该掌握的部分是 html 的 css 的使用，我们需要首先完成页面的早图的构思，然后使用 ps 完成页面的设计，最后使用 atom 完成 html 的页面的布局和 css 的元素的定义，从而完成前端的布局的工作，在这个过程中，其实没有太难的部分，关键是需要使用大量的案例的实战，来让自己对于整个页面的布局有一个清晰的认知，所以关键的部分在于大量的前端页面的设计的训练，大量模仿真实的案例，学会拆分和组装各种想要的元素的过程，来完成自己对于前端的提升，针对于整个应用来说，前端的技能体系很容易被后端的人所取代，其中的关键在于前端的个体没有完成整个应用的设计工作，而仅仅是完成了一层皮的包装，所以在这个过程中，我们可以普遍的发现单纯的前端的待遇没有后端的待遇多的主要原因就在于这个地方，但是在完成作品展示的时候，前端可以完成大量的作品的展示，而后端的技术的水平很难快速的得到凸显，所以在这个过程中，后端的个体一定要善于撰写自己的技术的文档，遇到什么问题，解决的方案是什么，已经解决后提升了那些性能，这样才可以更好的为自己的职业加分；&lt;/p&gt;
&lt;h2 id="第二个学习的方面：其次我们来谈一谈前端的框架"&gt;第二个学习的方面：其次我们来谈一谈前端的框架&lt;/h2&gt;
&lt;p&gt;我们在使用后端语言的使用的时候，最要在于完成 RMVC 的逻辑思维的架构，在这个架构的过程中，仅仅是一个人来玩这个应用，当我们想要完成 deivse 的用户的系统的时候，就会涉及到一对多和多对多的逻辑，在这个时候就更多的时候考验一个人对于整个逻辑的思维的架构问题了，所以我们在做应用的时候，关键是从不同的人完成不同的事情入手，在完成不同事情的时候，完成定义，这样就可以来完成后端的页面的搭建，我们在搭建页面的时候，主要在于完成 RMVC 的控制，在这个过程中，R 代表了 ROOT，其中在于完成路由器的控制的问题，使用 rake 命令可以完成路由器的查看，其中包好了 7 大基本的功能：indew、show、new、create、update、destory、edit；在这个过程中，我们可以使用 reascours 命令来完成整个路由的设定，在这个过程中，想要完成页面的展示，路由是一个非常重要的部分，没有设定好路由的应用，难以完成我们应该完成的效果；在完成路由之后，我们所需要去完成的是是 C 的部分，也就是 controller 的部分，完成对于原始的控制，在完成原始的控制的过程中，我们也是在七大动作的基础上完成的，对于基本的 CURD 来说，我们一开始的确难以记住其中的代码功能，所以一开始最好还是使用背诵的方式完成这个功能的展示，才可以最快速的学习如何完成一个页面的控制，在完成页面控制的时候需要玩是数据的处理，在处理数据的时候，我们会使用到 modle 的功能元素，在这个过程中，我们需要去构建一个 rails g modle 命名，后面的所有的需要可以在 DB 的元素里面添加，所以关键在于命名的部分，完成了命名之后，我们需要完成的是一一对应的关系；在这个过程中 modle 的文件夹里面主要是告诉你现在我们有哪些功能性元素，在 DB 里面主要告诉你我们应该完成哪些的处理的工作，这是我们所需要完成的，当我们非常的清晰了 modle 的结构，接下来就需要完成 view 的元素的处理，在处理元素的时候，主要完成 index、show、new、edit 的四个代码的书写工作，在书写以上的代码的元素的时候，我们主要需要完成的是首页的展示和编辑后的展示，在这个过程中，new 和 edit 的代码基本上是完全相同的，所以其实就会涉及到如何我弄成 index 和代码展示和 show 代码的展示，其实也就是涉及到前端的知识架构。&lt;/p&gt;
&lt;h2 id="所以在这个过程中，我们所需要完成的就是三个动作，第一个动作是如何做好路由器root的处理，第二个动作是如何做好数据modle处理规则的调用，在调用规则的时候，使用控制器controller告诉view完成四个页面的展示工作，从而完成一个页面的展示，在展示这个页面的过程中，我们需要完成用户逻辑的调用，学会完成一对多和多对多的规则的调用，就可以完成应用的人与人的交互；"&gt;所以在这个过程中，我们所需要完成的就是三个动作，第一个动作是如何做好路由器 root 的处理，第二个动作是如何做好数据 modle 处理规则的调用，在调用规则的时候，使用控制器 controller 告诉 view 完成四个页面的展示工作，从而完成一个页面的展示，在展示这个页面的过程中，我们需要完成用户逻辑的调用，学会完成一对多和多对多的规则的调用，就可以完成应用的人与人的交互；&lt;/h2&gt;&lt;h2 id="第三个学习的方面：最后我们来谈一谈应用的部署"&gt;第三个学习的方面：最后我们来谈一谈应用的部署&lt;/h2&gt;
&lt;p&gt;对于一个基本的应用来说，我们现在使用的是两个工具完成的应用的部署，第一个工具是代码的协作的工具，例如：GitHub，第二个工具是应用展示的工具 Herkou 的代码的部署，在使用 herkou 完成应用部署的时候，我们会发现图片的加载是非常慢的过程，所以在这个时候，我们最需要做的事情就是完成应用和数据库分离，也就需要各种云来帮助我们完成应用的部署工作，所以使用七牛云和阿里云就成为了一种需要，想要更好的完成网上页面的跳转工作，就需要使用域名完成跳转，也就是完成完成域名的购买和域名的部署，这样就可以完成应用的正式的上线；&lt;/p&gt;
&lt;h2 id="最后是关于移动端的配置"&gt;最后是关于移动端的配置&lt;/h2&gt;
&lt;p&gt;我们使用 Ruby 所打造出来的 Web App，天生就是全栈的应用，可以通过使用 IOS 工具和 Android 的工具快速的完成前端页面的修改工作，从而完成应用程序在安卓系统和苹果系统完成上线部署，所以在这个过程中，学习 Ruby 之后懂得了 RMVC 的框架之后，在从事移动端的开发，就会变得相对比较容易；&lt;/p&gt;
&lt;h2 id="对于应用程序的思考"&gt;对于应用程序的思考&lt;/h2&gt;
&lt;p&gt;作为一款商业的使用的应用，前期是完成程序的搭建，在这个时候技术是第一位的，当我们技术已经搭建完毕，后期所需要使用的是大量的运营的手段完成用户的积累的过程，这是一个缓慢和长时间的积累的过程，所以编程在互联网世界里面，不完全是第一位的，只有将自己的应用真正的变成为一个商业级别的应用，才可以快速的完成自己的劳动价值的回报；&lt;/p&gt;
&lt;h2 id="肖威"&gt;肖威&lt;/h2&gt;&lt;h2 id="才华横溢科技（北京）有限责任公司"&gt;才华横溢科技（北京）有限责任公司&lt;/h2&gt;&lt;h2 id="董事长"&gt;董事长&lt;/h2&gt;</description>
      <author>xiaoweirails</author>
      <pubDate>Sat, 30 Sep 2017 05:09:52 +0800</pubDate>
      <link>https://ruby-china.org/topics/34301</link>
      <guid>https://ruby-china.org/topics/34301</guid>
    </item>
    <item>
      <title>对于 Ruby on Rails 初学者入门的思考</title>
      <description>&lt;p&gt;前一段时间我完成了对于程序的上线的整个流程的架构，在这个过程中，完成了最简单的前端展示页面的呈现，在这个过程中，我们基本熟悉了一个简单程序上线的全部的流程，而在这个过程中，我们将进入的是相对最有价值的 CRUD 的程序的制作，在制作这个可以用来完成文本和数据上传的管道的过程中，我们可以发现下面几种需要掌握的知识体系：&lt;/p&gt;
&lt;h2 id="第一个知识体系是"&gt;第一个知识体系是&lt;/h2&gt;
&lt;p&gt;1、数据库的数据池，我们需要通过使用 rails g modle 命名 标题 内容 图片完成一个数据的结构架构，在这个过程中需要使用到 DB 的数据结构，这个部分需要深入的掌握；&lt;/p&gt;

&lt;p&gt;2、当我们将我们的数据完成了数据池的搭建，接下里就是完成数据的控制和数据的展示，在这个过程中，我们需要完成的是对于 controller 和 viwes 的代码的控制，在控制这个代码的过程中，通过终端控制器完成数据结构的搭建，使用 atom 完成数据的调试，在这个过程中，我觉得对于代码的使用至关重要。&lt;/p&gt;

&lt;p&gt;3、当我们将我们想要的 root 的路由器搭建好，使用 rake 命名可以查看我们对应的路由的网址情况，在这个过程中，我们需要完成的是 MVC 的一一对应的关系体系，这样才可以完成我们想要的页面的展示。&lt;/p&gt;
&lt;h2 id="第二个知识体系是"&gt;第二个知识体系是&lt;/h2&gt;
&lt;p&gt;1、我们知道了以上的知识体系的结构架构，在这个过程中，其实相对比较难的是如何更好的完成 RMVC 的对应关系，在这个过程中，只有对应关系的正确性，才可以完成程序的展示，没有正确的程序的展示，也就不可以完成我们想要的结果的表达，这是我们需要深刻认知到的核心的体系架构。&lt;/p&gt;

&lt;p&gt;2、我们通过学习三个人的知识体系，可以比较快速的完成整个知识结构的架构；&lt;/p&gt;

&lt;p&gt;（1）学习某某的课程可以最快速的熟悉整个的知识架构，只是郑伊廷的代码写的不够优雅，没有按照正确化的代码结构来完成代码的书写，所以在案例的解读上，有很大的阅读障碍，所以在这个过程中，我们需要进一步的了解代码的原理和命名的规则，在这个时候才可以进一步的完成自我的快速的提高。&lt;/p&gt;

&lt;p&gt;（2）在通过阅读某某的实战圣经的过程当中，也会遇到一些问题，就是知识点太对于分散，没有实际的案例可以作为参考，这是在学习的一个弊端。&lt;/p&gt;

&lt;p&gt;（3）在学习 12vs12 的课程的过程中，可以看到一些操作的实际的案例，懂得如何做好一个首页的展示的图，也可以看到一个网站搭建的全过程，仅仅在于小伙子使用的是 haml 语言和使用的是 rails4 的语言，这对于现在的我们来说，不利于快速的掌握和提高；所以其实我们希望获得是是当今现在最新的 rails 的案例使用的场景，只有大量的接触到大量的 rails 的实际的案例的公司，这样才可以快速的帮助我们自己获得快速的成长。&lt;/p&gt;
&lt;h2 id="但是以上的三个人的知识体系，都是值得我们学习的，我们在发现别人不足的过程中，是因为我们自己的实力提升了，不代表刚入门的时候，老师没有教导好，仅仅在于需要打造自己的产品的时候会发现有不足的地方。"&gt;但是以上的三个人的知识体系，都是值得我们学习的，我们在发现别人不足的过程中，是因为我们自己的实力提升了，不代表刚入门的时候，老师没有教导好，仅仅在于需要打造自己的产品的时候会发现有不足的地方。&lt;/h2&gt;&lt;h2 id="思考：如何才可以加上自己学习Ruby On Rails的速度"&gt;思考：如何才可以加上自己学习 Ruby On Rails 的速度&lt;/h2&gt;&lt;h2 id="1、大量真实运行案例的观测和维护；"&gt;1、大量真实运行案例的观测和维护；&lt;/h2&gt;
&lt;p&gt;我们需要在最短的时间里面知道整个软件是如何部署成功的，如何运营的过程，这样就可以知道猪是如何跑的，通过看猪如何跑，方便自己快速的完成杀猪的过程，我们过去在学习里面学习最大的问题就在于我们接触的实际的案例太少，当我们学习和掌握的实际案例太少之后所带来的问题就是不可以快速的完成独立的产品的架构，这样我们就缺乏完成产品化的能力，没有产品化的能力，其实也就难以快速的完成自我的提高；所以一个想要快速的提高自己能力的个体，最应该做的事情是看大量的实际运行的案例，只有大量的案例的辅助，才可以快速的提升自己的实力。&lt;/p&gt;
&lt;h2 id="2、上线自己真实可行的案例，不断优化；"&gt;2、上线自己真实可行的案例，不断优化；&lt;/h2&gt;
&lt;p&gt;学习是在模仿的基础上完成的，我们如果想要更加快速的提升自己的实力，关键还是在于不断的解决自己的问题的过程中，快速的提升自己的实力，所以一切学习的模仿最后都需要完成自己的产品的打造，只有真实的打造出了自己的产品，才能真正的掌握一门编程的技能体系；&lt;/p&gt;
&lt;h2 id="3、行业的小班化交流；"&gt;3、行业的小班化交流；&lt;/h2&gt;
&lt;p&gt;真正的实操性的知识体系，有些事不宜在大会上演讲的，所以积极的参加一些行业的小班化的实战的线下的交流是非常必要的，感觉现在的这个方面，还是比较的欠缺一些，后期会针对 RMVC 的对应关系，系统化的讲解一些 R、M、V、C 的使用，这样既帮助自己快速的梳理知识结构，也可以快速的帮助初学者快速的入门；&lt;/p&gt;
&lt;h2 id="温习提示："&gt;温习提示：&lt;/h2&gt;
&lt;p&gt;如何快速的掌握 Ruby On Rails 所需要掌握的入门级别的知识&lt;/p&gt;

&lt;p&gt;1、Ruby On Rails 环境的搭建&lt;/p&gt;

&lt;p&gt;2、GitHub 的账号的使用&lt;/p&gt;

&lt;p&gt;3、Heroku 的账号的使用&lt;/p&gt;

&lt;p&gt;4、完成最简单的展示页的呈现完成两个账号的记录&lt;/p&gt;

&lt;p&gt;（1）GitHub 地址：&lt;/p&gt;

&lt;p&gt;（2）Heroku 地址：&lt;/p&gt;
&lt;h2 id="作者介绍："&gt;作者介绍：&lt;/h2&gt;&lt;h2 id="肖威"&gt;肖威&lt;/h2&gt;&lt;h2 id="才华横溢（科技）有限责任公司"&gt;才华横溢（科技）有限责任公司&lt;/h2&gt;&lt;h3 id="董事长"&gt;董事长&lt;/h3&gt;</description>
      <author>xiaoweirails</author>
      <pubDate>Fri, 29 Sep 2017 12:10:04 +0800</pubDate>
      <link>https://ruby-china.org/topics/34291</link>
      <guid>https://ruby-china.org/topics/34291</guid>
    </item>
    <item>
      <title>关于创业后的几点心得体会</title>
      <description>&lt;h2 id="什么人在创业？"&gt;什么人在创业？&lt;/h2&gt;
&lt;p&gt;第一类人：啥都没有，想要创业；（大学生群体）&lt;/p&gt;

&lt;p&gt;第二类人：有一技之长，在公司学成归来，用技术创业；（企业高管）&lt;/p&gt;

&lt;p&gt;第三类人：已经成功，想要更高的追求，来参与创业；（投资人在创业）&lt;/p&gt;
&lt;h2 id="创业与什么有关？"&gt;创业与什么有关？&lt;/h2&gt;
&lt;p&gt;创业的本质是为了完成企业的盈利，至于你做的是什么东西，在企业的财务报表的数字上来说，是没有任何关系的，
所以我们单纯的看一家公司的好坏可以通过查看公司财务报表来知晓，前提是这一家公司没有完成财务报表的造假；&lt;/p&gt;
&lt;h2 id="创业需要具备什么东西？"&gt;创业需要具备什么东西？&lt;/h2&gt;
&lt;p&gt;我们很多的孩子对于创业这一件事其实是不够了解的，真正的创业的关键是为了完成时间服务的一种交换，只有学会交换的思维体系，才可以更好的在这个社会上立足，在这个过程中，如何说你也想要创业，其实更多的时候，你需要问问你的手上有什么可以用来交换的东西，只有具备了交换的东西，才可以具备创业的可能性。&lt;/p&gt;
&lt;h2 id="大学生适不适合创业？"&gt;大学生适不适合创业？&lt;/h2&gt;
&lt;p&gt;针对当今的教学体系来说，我个人觉得绝大多数的大学生是普遍不适合创业的，关键就在于我们的大学生没有对于社会的清晰的认知，因为对于社会的认知不够清晰，所以在这个时候，普遍对于商业的逻辑都不清晰，但是我还是主张大学生应该在大学期间创业，当你具备了创业的经历，能够让你更好的成为一家企业的管理者，但是不建议毕业后没有任何准备的创业，这样没有行业的经验的积累，盲目的浪费自己成长的时间，是一件非常不划算的事情。&lt;/p&gt;
&lt;h2 id="赚钱重不重要？"&gt;赚钱重不重要？&lt;/h2&gt;
&lt;p&gt;对于刚刚毕业的大学生来说，我个人觉得成长比赚钱更重要，在一个时间不断增长的时代里面，赚钱这一件事情其实会变得相对越来越容易，但是能够成为这个时代里面真正优秀的人的机会却没有那么多，所以在职业的早期，选择一个高速发展的行业和高速成长的企业对于自己来说，会比单纯的金钱更有价值。&lt;/p&gt;

&lt;p&gt;暂时谈到这个地方，如果大家对于创业和就业有什么不清晰的地方，可以在下面提问，有时间的时候，给与大家一些帮助和启迪。&lt;/p&gt;
&lt;h2 id="创业有风险，入市须谨慎；"&gt;创业有风险，入市须谨慎；&lt;/h2&gt;
&lt;p&gt;肖威
才华横溢科技（北京）有限责任公司
董事长&lt;/p&gt;</description>
      <author>xiaoweirails</author>
      <pubDate>Fri, 29 Sep 2017 11:17:25 +0800</pubDate>
      <link>https://ruby-china.org/topics/34287</link>
      <guid>https://ruby-china.org/topics/34287</guid>
    </item>
    <item>
      <title> [北京] 才华横溢 (共享教育项目) Ruby 全栈开发工程师 (薪资 1.8K~8.8K)</title>
      <description>&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2017/f1ef32af-a4d5-4a96-9652-9a4a553df546.png!large" title="" alt=""&gt;&lt;/p&gt;
&lt;h2 id="我们是谁:"&gt;我们是谁：&lt;/h2&gt;
&lt;p&gt;才华横溢科技（北京）有限责任公司。&lt;/p&gt;

&lt;p&gt;位于北京市海淀区中关村创业大街。目前公司发展良好，需要完成人才储备若干。&lt;/p&gt;
&lt;h2 id="我们是一家什么样的公司？"&gt;我们是一家什么样的公司？&lt;/h2&gt;
&lt;p&gt;我们是一家专注于帮助普通人获得成功的公司。&lt;/p&gt;
&lt;h2 id="薪酬福利："&gt;薪酬福利：&lt;/h2&gt;&lt;h2 id="薪水范围 1.8K~8.8K，月度奖金1.0k~30k，具体看能力和公司的业绩而定。"&gt;薪水范围 1.8K~8.8K，月度奖金 1.0k~30k，具体看能力和公司的业绩而定。&lt;/h2&gt;
&lt;p&gt;人才招募岗位：&lt;/p&gt;
&lt;h2 id="A：前端设计师"&gt;A：前端设计师&lt;/h2&gt;
&lt;p&gt;（具备 PS 设计、网页端实现者优先考虑）&lt;/p&gt;

&lt;p&gt;负责公司的移动端 + 微信端 + 网页端的前端视觉化的呈现；&lt;/p&gt;
&lt;h2 id="B： 后端Ruby工程师"&gt;B：后端 Ruby 工程师&lt;/h2&gt;
&lt;p&gt;（不局限 Ruby，可以是 Go、PHP、JAVA 等其他的后端语言，关键是具备学习能力）&lt;/p&gt;

&lt;p&gt;负责公司的移动端 + 微信端 + 网页端的后端功能的实现；&lt;/p&gt;

&lt;p&gt;负责公司产品的运维的稳定；
为我们产品提供炮弹：产品 API 接口开发；
让产品功能靠谱：产品后端功能开发；
让运营开足马力：完善产品后台的建设；
跟外援搞好关系：第三方 SDK，API 的嵌套开发。&lt;/p&gt;
&lt;h2 id="加分项"&gt;加分项&lt;/h2&gt;
&lt;p&gt;1.编程基础扎实，有较强的学习能力，对创新技术有强烈求知欲，愿意学习新知识；&lt;/p&gt;

&lt;p&gt;2.一年以上 Ruby On Rails 的开发经验；&lt;/p&gt;

&lt;p&gt;3.熟练使用 Github 等工具；&lt;/p&gt;

&lt;p&gt;4.熟悉关系型和非关系型数据库的开发；&lt;/p&gt;

&lt;p&gt;5.良好的编码风格，很强的自学能力，良好的团队合作意识及积极的心态；&lt;/p&gt;
&lt;h2 id="C：新媒体运营"&gt;C：新媒体运营&lt;/h2&gt;
&lt;p&gt;负责公司的对外的新媒体的运营工作。&lt;/p&gt;
&lt;h2 id="D：因人设岗"&gt;D：因人设岗&lt;/h2&gt;
&lt;p&gt;如果你觉得以上的岗位没有适合你的，而你想要从事自己想要从事的岗位，欢迎投递简历；&lt;/p&gt;

&lt;p&gt;我们会根据实际的业务的需要，完成人才的储备，为你专门设置你想要从事的工作岗位；&lt;/p&gt;
&lt;h2 id="E：付费学习"&gt;E：付费学习&lt;/h2&gt;
&lt;p&gt;针对于想要加入互联网公司的应届毕业生，或者是想要完成转行的其他人员，我们有针对于你们所完成的职业培训项目，可以通过付费的形式，完成自己能力的提升，从而获得进入互联网公司的门票，请前往公司洽谈；&lt;/p&gt;

&lt;p&gt;联系人：肖威  电话：157 0158 7150 邮箱：494410617@qq.com &lt;/p&gt;

&lt;p&gt;地点：北京市海淀区中关村创业大街天使汇 &lt;/p&gt;

&lt;p&gt;我们会在 48 小时内通知面试或答复。&lt;/p&gt;</description>
      <author>xiaoweirails</author>
      <pubDate>Wed, 27 Sep 2017 10:59:36 +0800</pubDate>
      <link>https://ruby-china.org/topics/34269</link>
      <guid>https://ruby-china.org/topics/34269</guid>
    </item>
  </channel>
</rss>
