Rails Tutorial 9章 10章

9章

なんかいつの間にか終わらせてた。
理解が進んでいないので一回読んだあともう一度読んだ。
自分一人で実装とかできる自信ない。

10.0の最初の演習

newとeditでformを共有したいって要件
下記のようにした。

view

optionで必要な値を与える

<% provide :title, "Sign up" %>
<% provide :button_text, "Create my account" %>
<% option = { url: signup_path } %>
<h1>Sign up</h1>

<div class="row">
  <div class="col-md-6 col-md-offset-3">
    <%= render "form", option: option %>    
  </div>
</div>

共有するform

<%= form_for(@user,  option ||= {} ) do |f| %>
  <%= render 'shared/error_messages' %>

  <%= f.label :name %>
  <%= f.text_field :name, class: 'form-control' %>

10.0の最後の演習

Nokogiriぇーー

    assert_select "div#error_explanation > ul > li", count: 4

面白いねrails。rails5は本当に完成度高い。

Rails Tutorial 7章

特に引っかかるところもなく。
titleをprovide使わずに省力していたところをチュートリアルどおりに変更した。
guard良いね。
gtags苦心したけどあんま使わないな。今のところ。
rinariでうまいことやってる。

Emacsでgtagsと真剣に向き合い楽しくRails開発する2017

これまで

めちゃくちゃgrepしてた。もうやめたい。

やりたいこと。

  • タグジャンプがしたい
  • できればhelm/anythingで
  • タグファイルは自動更新してほしい

実行

gtagsのインストール

brew install global --with-exuberant-ctags --with-pygments

gtags.elはなんかパス通ってた

なければ
www.gnu.org
から落として展開してelみつけてパスの通ったディレクトリに置いて。githubとかで開発されてない。

anythin-gtagsのインストール

M-x auto-install-from-url [RET] https://www.emacswiki.org/emacs/download/anything-gtags.el

設定

(require 'gtags)
(require 'anything-gtags)
(add-hook 'ruby-mode-hook
          '(lambda()
             (gtags-mode 1)))

とりまruby-modeにフック

anythingの定義とかキーバインドとか

F3は定義ジャンプの定番(Eclipse教徒、信者ではない)

(defun anything-gtags-from-here ()
    (interactive)
    (anything
     :sources '(anything-c-source-imenu
                anything-c-source-gtags-select
                )
     :input (thing-at-point 'symbol)))
(global-set-key [f3] 'anything-gtags-from-here)

自動更新

;; update GTAGS
(defun update-gtags (&optional prefix)
  (interactive "P")
  (let ((rootdir (gtags-get-rootpath))
        (args (if prefix "-v" "-iv")))
    (when rootdir
      (let* ((default-directory rootdir)
             (buffer (get-buffer-create "*update GTAGS*")))
        (save-excursion
          (set-buffer buffer)
          (erase-buffer)
          (let ((result (shell-command "/usr/local/bin/gtags --gtagslabel=pygments")))
            (if (= 0 result)
                (message "GTAGS successfully updated.")
              (message "update GTAGS error with exit status %d" result))))))))

参考URLと違って生でshell-command叩いてる。特に深い意味はない。

プロジェクト初期作業

gtagsをプロジェクトルートで一回実行しておく

$ cd /path/to/project/
$ /usr/local/bin/gtags --gtagslabel=pygments

実際はaliasを設定しておけばよく、こんなコマンド覚える必要はない。

確認

メソッドがあるかどうかを確認するには global <メソッド名>

$ global new
app/controllers/users_controller.rb

*1

結果

ファイルを保存したらgtagsが走り、データベースが再生成される。メソッド呼び出しでF3押せばanythingで検索、ジャンプできる。M-*でジャンプ先から戻れる。
すごーい!
たのしー

*1:newメソッドはRailsプロジェクトなら多分あるよね。。。

Rails Tutorial 6章

minitest-reportersと(結局)guardを入れました。
じゃぁということでterminal-notifier-guardも入れて通知領域にguardの結果が表示されます。

guardよいですね。Emacsのモードラインが赤くなったり緑になったり大変気持ち良い

仕事ではJava書いてますけどやっぱrubyは良いです。

Gemfile
group :development, :test do
  # Use sqlite3 as the database for Active Record
  gem 'sqlite3','1.3.11'
  # Call 'byebug' anywhere in the code to stop execution and get a debugger console
  gem 'byebug','9.0.0', platform: :mri
  gem 'rails-controller-testing'
  gem 'minitest-reporters',       '1.1.9'
  gem 'guard',                    '2.13.0'
  gem 'guard-minitest',           '2.4.4'
  gem 'terminal-notifier-guard', '~> 1.6.1'
end
Guardfile
# Guardのマッチング規則を定義
guard :minitest, spring: "bin/rails test", all_on_start: false do
  watch(%r{^test/(.*)/?(.*)_test\.rb$})
  watch('test/test_helper.rb') { 'test' }
  watch('config/routes.rb')    { integration_tests }
  watch(%r{^app/models/(.*?)\.rb$}) do |matches|
    "test/models/#{matches[1]}_test.rb"
  end
  watch(%r{^app/controllers/(.*?)_controller\.rb$}) do |matches|
    resource_tests(matches[1])
  end
  watch(%r{^app/views/([^/]*?)/.*\.html\.erb$}) do |matches|
    ["test/controllers/#{matches[1]}_controller_test.rb"] +
    integration_tests(matches[1])
  end
  watch(%r{^app/helpers/(.*?)_helper\.rb$}) do |matches|
    integration_tests(matches[1])
  end
  watch('app/views/layouts/application.html.erb') do
    'test/integration/site_layout_test.rb'
  end
  watch('app/helpers/sessions_helper.rb') do
    integration_tests << 'test/helpers/sessions_helper_test.rb'
  end
  watch('app/controllers/sessions_controller.rb') do
    ['test/controllers/sessions_controller_test.rb',
     'test/integration/users_login_test.rb']
  end
  watch('app/controllers/account_activations_controller.rb') do
    'test/integration/users_signup_test.rb'
  end
  watch(%r{app/views/users/*}) do
    resource_tests('users') +
    ['test/integration/microposts_interface_test.rb']
  end
end

途中で一度Springを全部殺すというのをやった。

kill `ps ax|grep spring|grep -v grep|cut -d" " -f 1`
kill `ps ax|grep spring|grep -v grep|cut -d" " -f 2`

Rails Tutorial 5章

scss初めてちゃんと触ったかも。まぁまぁ良いじゃん。単品で使う気にはならないけれど。コンパイルがめんどくさそう。Railsみたいに仕組みが上手く動いていたらとても良いですね。

結合テストで怒られたので言われたとおりにgem入れる

Error:
SiteLayoutTest#test_layout_links:
NoMethodError: assert_template has been extracted to a gem. To continue using it,
        add `gem 'rails-controller-testing'` to your Gemfile.
    test/integration/site_layout_test.rb:9:in `block in <class:SiteLayoutTest>'

testがわからんからサイトよんだ

昔はRspecだった気がするのだけれど。
railsguides.jp

むかしはguardかけてGrowlに出すとかに血道を上げていたけど、いまはもう、`rails test`って普通に叩いて満足だもんな。