LoginSignup
9
9

More than 5 years have passed since last update.

書籍『Ruby on Rails 5 超入門』つまずきやすいポイントまとめ【Chapter2】

Last updated at Posted at 2017-04-01

関連記事

私の環境

  • Windows 10 Home 64bit
  • Ruby 2.2.6
  • Rails 5.0.2

つまずきやすいポイント

[p.84] stylesheet_link_tagでエラーが発生した場合の対処法

私の環境では、SassをつかってHeloコントローラ用のスタイルを作成し、いざ表示!というところでエラーが発生しました。

ExecJS::ProgramError in Helo#index
ActionView::Template::Error (TypeError: オブジェクトでサポートされていないプロパティまたはメソッドです。):
    4:     <title>RailsApp</title>
    5:     <%= csrf_meta_tags %>
    6:
    7:     <%= stylesheet_link_tag    'application', media: 'all', 'data-turbolinks-track': 'reload' %>
    8:     <%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>
    9:   </head>
   10:

原因・対処法については、書籍のサポートページにある「Section 2-3のExecJS::ProgramErrorについて(PDF)」に掲載されていますのでそちらを参照してください。ただし、手順通り実行すると誤りやすいので一部補足します。

上記PDFでは、2つの手順が紹介されています。

  1. 「/app/views/layouts/application.html.erb」の'applications'を'defaults'に書き換える。
  2. 手順1でも解決しない場合は「CoffeeScript 1.8.0」を指定する。

実際に、手順1を実行しても解決しない場合に、そのまま手順2と実行を進めると、ページは表示されるようになるものの、「defaults.css」「defaults.js」という存在しないファイル(404)を参照しようとします。その結果、文字色等の装飾が反映されない状態となってしまいます

正しくは、手順2まで実行しなければいけない場合には、手順1で変更したものを戻す('defaults'->'applications'への書き直し)作業が必要です。これにより、正しく装飾が反映された状態となります。

[p.93] 「request.post?」メソッド末尾のクエスチョンマーク(疑問符)の正体

メソッド名の一部とのこと。初めて見ましたが、ほかの言語だと「is_xxx」等のメソッド名で管理しているところを、Rubyではこのような命名もできるのですね。

def xx?
この場合の「?」はメソッド名の一部分です。 慣用的に、真偽値を返すタイプのメソッドを示すために使われます。

参考: Rubyで使われる記号の意味(正規表現の複雑な記号は除く) (Ruby 1.8.7)

[p.124] ミニ伝言板のソースは、書籍のサポートページから入手可能

HTMLやスタイルシート等について、全て手打ちする時間がとれない場合は、書籍のサポートページにある「一括ダウンロード」からサンプルソースをダウンロードできます。理解できていると思うところは、コピペして時間を節約しましょう。

というか、全て手打ちだと、細かい間違いに、気づきづらい(=詰まりやすい)行数なのでコピペしたほうが個人的には良いかと思います。

[p.135] 実行後のデータの保存先

書籍どおりに作業されているならば「Desktop\RailsApp\data.txt」に保存されています。

Controllerでしていることコメント解説

自分の勉強をかねてControllerにコメントを追記してみました。ソースを読んでも何をしているのかよく分からない方は参考にしていただけましたら幸いです。(ざっくり書かれている、p.139「JSON型式データとRubyオブジェクト」のコラムの意味もちょっとは理解しやすくなるはずです。)

class DengonbanController < ApplicationController
    layout 'dengonban'


    def initialize
        super

        begin
            # data.txtに登録されている伝言情報一式を取得し、メモリ上の@dengon_dataに代入します。
            @dengon_data = JSON.parse(File.read("data.txt"))
        rescue
            # 取得できない場合は、空のHashを作成しておきます。
            @dengon_data = Hash.new
        end

        # メモリ上の@dengon_dataから24時間を過ぎた伝言は削除します。
        # 後半の登録処理(indexメソッド内)において、
        # 時間をキーとして書き込まれているので、そのままキーは時間で復元されています。
        # (この時点では元のテキストデータからは削除されません。)
        @dengon_data.each do |key,obj|
            if Time.now.to_i - key.to_i > 24*60*60 then
                @dengon_data.delete(key)
            end
        end

        # メモリ上の@dengon_data(古い伝言削除済み)を、data.txtに新たに上書きます。
        # (ここでようやく元のテキストデータからも削除されます。)
        File.write("data.txt", @dengon_data.to_json)
    end


    def index

        # ###################################################
        # initializeが冒頭で実行されます。(7章Ruby超入門を復習) 
        # ###################################################

        if request.post? then

            # フォームから送信された値を使って、MyDataオブジェクト(伝言1件)を生成します。
            obj = MyData.new(msg:params['msg'], name:params['name'], mail:params['mail'])

            # 時間をキーにして、オブジェクトを追加します。
            # (@dengon_dataには、initializeメソッドで取得した過去の伝言が含まれています。)
            newkey = Time.now.to_i
            @dengon_data[newkey] = obj

            # ==================================================
            # この時点で、@dengon_dataはクラスが混合して代入されている。
            # 登録済みのKeyはHash型、今回追加されたKeyにはMyClass型となっている。
            # p.139 のコラム参照。
            # 例:
            #   @dengon_data[oldkey1]['msg']
            #   @dengon_data[oldkey2]['msg']
            #   ...
            #   @dengon_data[newkey].msg
            # ==================================================

            # JSONテキストに変換してファイルに伝言一式(新しいものを含む)を書き込みます。
            data = @dengon_data.to_json
                File.write("data.txt", data)

            # JSONテキストになった伝言一式をHash型に一括変換されます。
                @dengon_data = JSON.parse(data)

            # ==================================================
            # この時点でようやく@dengon_dataはクラスはHash型に統一される。
            # 例:
            #   @dengon_data[oldkey1]['msg']
            #   @dengon_data[oldkey2]['msg']
            #   ...
            #   @dengon_data[newkey]['msg']
            # ==================================================

        end
    end
end

誤植

[p.121] ページ末尾のリストのファイル名

  • 誤) [リスト2-34] helofooter.html.erb
  • 正) [リスト2-34] helo_footer.html.erb

今後

引き続き、詰まりやすそうかなあというポイントがあればまた投稿します。

9
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
9