Madogiwa Blog

主に技術系の学習メモに使っていきます。

javascript:form上でエンターキーを無効にする方法

webページ上でエンターキーを押したときにSubmitされるのを無効にしたくて、色々調べたのでメモ

方法:javascript内でエンターキーを検出し、falseを返す。

// エンターキー押下時のsubmitを無効化
$('input').on('keydown', function(e){
  if ((e.wich && e.wich === 13) || (e.keyCode && e.keyCode === 13)) {
    return false
  } else {
    return true
  }
})

onSubmitイベント時にfalseが返されると処理を中断されるため、ページの書換えが行われなくなるようだ。

参考ページ qiita.com

blog.livedoor.jp

javascript:beforeunloadにメッセージを設定できなかった話

javascriptで、ページ遷移時にalertを表示したくて下記ページ等を色々と調べた。

ezolab-blog.net

www.koikikukan.com

// ページ遷移時にalertを表示
$(window).on('beforeunload', function(e) {
  return 'タスクが消えてしまいますが、ページから離れてもよろしいですか?';
});

alertは表示出来たけど、任意のメッセージが設定できない・・・。 f:id:madogiwa0124:20170119004234p:plain

なんだかchromeの仕様みたいなので、あきらめる。

qiita.com

RubyonRails:stack level too deepでハマった話

RailsTutorial中にstack level too deepでハマったのでメモ

エラー画面

f:id:madogiwa0124:20170117000619p:plain

原因

現在ログインしているユーザの取得処理とその呼び出し元のメソッド名が重複していた。

class MicropostsController < ApplicationController
    before_action :logged_in_user,only:[:create,:destroy]
    before_action :current_user,  only: :destroy

    def destroy
        @micropost.destroy
        flash[:success] = "Micropost deleted"
        redirect_to request.referrer || root_url
    end

    private
    def micropost_params
        params.require(:micropost).permit(:content)
    end
   
    def current_user
        # この行のcurrent_userが再起呼び出しになっていた
        # ※本来は、ログイン中のユーザを取得したかった
        @micropost = current_user.microposts.find_by(id: params[:id])
        redirect_to root_url if @micropost.nil?
    end
end

解決方法

呼び出し元のメソッド名を重複しないよう変更した。

class MicropostsController < ApplicationController
    before_action :logged_in_user,only:[:create,:destroy]
    before_action :set_micropost,  only: :destroy

    def destroy
        @micropost.destroy
        flash[:success] = "Micropost deleted"
        redirect_to request.referrer || root_url
    end

    private
    def micropost_params
        params.require(:micropost).permit(:content)
    end

    # メソッド名変更
    def set_micropost 
        @micropost = current_user.microposts.find_by(id: params[:id])
        redirect_to root_url if @micropost.nil?
    end
end

[参考ページ] teratail.com

javascript:HTML上のtableをCSV出力する。

自作アプリ(TaskBorderTaskBorder)で、HTML上のtableをCSV出力したかったので、色々調べたことをメモ

やりたかったこと

tableタグの内容をCSV出力したかった。

実際にやったこと

jQuery pluginの「table2csv」を使ってみた。

www.jqueryscript.net

下記な感じで意外と簡単に使えたので、メモメモ
①htmlファイル内でtable2csv.jsの読み込み

<!-- jQueryの読み込み -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<!-- table2csvの読み込み -->
<script src="src/table2csv.js"></script>

②tableの準備

    <div>
        <table id="table">
            <thead id="head">
                <tr><th>title</th></tr>
            </thead>
            <tbody id="body">
                <td>value</td>
            </tbody>
        </table>
            <button type="button" id="downloadCsvBtn"> 
                 CSV download
            </button>
    </div>

③buttonのclickイベント内にCSV出力処理を追加

$('#downloadHisCsvBtn').click(function () {
    // CSV形式に整形
    $("#table").table2csv('output', { appendTo: '#out' });
    // ファイル名の定義(table.csv)
    $("#table").table2csv('output', { filename:  'table.csv' });
    // CSV出力
    $("#table").table2csv();
})

RubyonRails:RubyonRailsチュートリアル回答メモ(第7章)

第7章の回答メモです。

「ユーザー登録」

問1

リスト7.31のコードを使用して、7.1.4で定義されたgravatar_forヘルパーにオプションのsizeパラメーターを取ることができる (gravatar_for user, size: 40のようなコードをビューで使用できる) ことを確認してください。(9.3.1でこれを改善したヘルパーを使います)

回答

user_helper.rb

module UsersHelper
# 引数で与えられたユーザのGravator画像を返す
  def gravator_for(user,options = {size: 80})
    gravatar_id = Digest::MD5::hexdigest(user.email.downcase)
    size = options[:size]
    gravator_url = "https://secure.gravatar.com/avatar/#{gravatar_id}?s=#{size}"
    image_tag(gravator_url,alt: user.name,class: "gravatar")
  end
end

プロフィール画像のサイズが指定したとおり、「80px,80px」となる。 f:id:madogiwa0124:20160925222846p:plain

問2

リスト7.18で実装したエラーメッセージに対するテストを書いてみてください。どのくらい細かくテストするかはお任せします。リスト7.32にテンプレートを用意しておいたので、参考にしてください。

回答

users_signup_test

  test "invalid signup information" do
    get signup_path
    assert_no_difference 'User.count' do
      post users_path,user:{
        name:                  "",
        email:                 "user@invalid",
        password:              "foo",
        password_confirmation: "bar"
      }
    end
    assert_template 'users/new'
    assert_select 'div#error_explanation' # 生成されるHTML要素に左記が含まれるかtest
    assert_select 'div.field_with_errors'   # 生成されるHTML要素に左記が含まれるかtest
  end

問3

7.4.2で実装したflashに対するテストを書いてみてください。どのくらい細かくテストするかはお任せします。 リスト7.33に最小限のテンプレートを用意しておいたので、参考にしてください (ヒント: FILL_INメソッドを適切なコードに置き換えると完成します)。(テキストに対するテストは壊れやすいです。文量の少ないflashのキーであっても、それは同じです。個人的には、flashが空でないかをテストするだけの場合が多いです)

回答

user_signup_test.rb

  test "valid signup information" do
    get signup_path
    assert_difference 'User.count',1 do
      post_via_redirect users_path,user:{
        name:                  "Example User",
        email:                 "user@example.com",
        password:              "password",
        password_confirmation: "password"
      }
    end
    assert_template 'users/show'
    assert_not flash.empty? # 追加
  end
end

問4

7.4.2で触れたように、flash用のHTML (リスト7.25) は読みにくいです。より読みやすくしたリスト7.34のコードに対してテストスイートを実行し、こちらも正常に動作することを確認してください。このコードでは、Railsのcontent_tagヘルパーを使用しています。

回答

application.html.erb

      <% flash.each do |message_type,message| %>
         <%= content_tag(:div, message, class: "alert alert-#{message_type}") %>
      <% end %>

ここまで

RubyonRails:RubyonRailsチュートリアル回答メモ(第6章)

第6章の回答メモです。

「ユーザーのモデルを作成する」

問1

リスト6.31の、メールアドレスを小文字に変換するコードに対するテストを、リスト6.41に示されているように作成してください。このテストでは、reloadメソッドを使用してデータベースから値を再度読み込み、assert_equalメソッドを使用して同値であるかどうかをテストしてください。リスト6.41のテストが正しいかどうか検証するために、before_saveの行をコメントアウトするとテストが失敗し、元に戻すと成功することを確認してください。

回答

user_test.rb

  test "email addresses should be saved as lower-case" do
    mixed_case_email = "Foo@exAMPle.CoM"
    @user.email = mixed_case_email
    @user.save
    assert_equal mixed_case_email.downcase,@user.reload.email
  end

user.rb

  before_save { self.email = email.downcase }    # $ bundle exec rake test の結果: true
  # before_save { self.email = email.downcase } # $ bundle exec rake test の結果: false

問2

before_saveコールバック内でemail.downcase!と書き、email属性を直接変更してもよいことを、テストスイートを走らせて確認してください (リスト6.42のように書いてもよいことを、テストスイートを実行して確認してください。

回答

user.rb

    before_save { email.downcase! }    # $ bundle exec rake test の結果: true

問3

before_saveコールバック内でemail.downcase!と書き、email属性を直接変更してもよいことを、テストスイートを走らせて確認してください (リスト6.42のように書いてもよいことを、テストスイートを実行して確認してください。

回答

user_test.rb

  test "email validation should accept invalid addresses" do
    invalid_addresses = %w[
                          user@example,com
                          user_at_foo.org
                          user.name@example.
                          foo@bar_baz.com
                          foo@bar..com #"."が2回以上出現するケース
                        ]
    invalid_addresses.each do |invalid_address|
      @user.email = invalid_address
      assert_not @user.valid?,"#{invalid_address.inspect}should be valid"
    end
  end

user.rb

    VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-]+(\.[a-z\d\-]+)*\.[a-z]+\z/i   # $ bundle exec rake test の結果: true
  # VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i# $ bundle exec rake test の結果: false

ここまで

RubyonRails:RubyonRailsチュートリアル回答メモ(第1章)

Ruby on Rails チュートリアルの演習回答メモです。

第一章「ゼロからデプロイまで」

演習1

問1

リスト1.8のhelloアクションを書き換え、「Hello, world!」の代わりに「hola, mundo!」と表示されるようにしてみましょう。課外作業: Railsの表示では「非ASCII文字」もサポートされています。スペイン語特有の逆さ感嘆符「¡」を含む「¡Hola, mundo!」を表示してみましょう (図1.19)20 

回答

application_controller.rb

class ApplicationController < ActionController::Base
  # Prevent CSRF attacks by raising an exception.
  # For APIs, you may want to use :null_session instead.
  protect_from_forgery with: :exception
  def hello
      render text:"hola, mundo!"
  end
end
問2

リスト1.8のhelloアクションを複製して、第2のアクションgoodbyeを追加しましょう。このアクションは、「goodbye, world!」というテキストを表示します。リスト1.10のルーティングを編集して、ルートルーティングの割り当て先をhelloアクションからgoodbyeアクションに変更します (図1.20)。

回答

application_controller.rb

class ApplicationController < ActionController::Base
  # Prevent CSRF attacks by raising an exception.
  # For APIs, you may want to use :null_session instead.
  protect_from_forgery with: :exception
  def hello
      render text:"hola, mundo!"
  end

  def goodbye
      render text:"goodbye, world!!"
  end

end

routes.rb

Rails.application.routes.draw do
  root 'application#goodbye'
end

とりあえず、一章はここまで