20190727のRailsに関する記事は16件です。

Rakeタスクの実装

本日の学習内容のアウトプット。

Rakeタスクとは、ターミナルなどのコマンドライン上からアプリケーションを実行できる機能の一つです。
CSVデータのインポートなどがRailsコンソールなどを使用しなくても簡単に処理ができるようになります。

Rakeタスクの実装

Rakeタスクの実装は以下のコマンドを入力します。

rails new rake タスク名

すると、lib/tasks/task_sample.rakeが生成されるのでこのファイルに記述して行きます。

namespace :import_csv do
  # rake import_csv:users
  desc "User CSVデータのインポート #実行処理の説明"
  task users: :environment do
    User.import('db/csv_data/user_data.csv')
  end
end

Railsでは、デフォルトで設定されているRakeタスクがあります。
これらのタスクは、アプリを作成する際自動で定義されます。
以下のコマンドをターミナルに入力すると、先ほど作成したRakeタスクと一緒に表示されます。

rake -T

表示されたRakeタスク

user-no-MacBook-Pro:csv_data user$ rake -T
rake about                              # List versions of all Rails framew...
rake active_storage:install             # Copy over the migration needed to...
rake app:template                       # Applies the template supplied by ...
rake app:update                         # Update configs and some other ini...
rake assets:clean[keep]                 # Remove old compiled assets
rake assets:clobber                     # Remove compiled assets
rake assets:environment                 # Load asset compile environment
rake assets:precompile                  # Compile all the assets named in c...
rake cache_digests:dependencies         # Lookup first-level dependencies f...
rake cache_digests:nested_dependencies  # Lookup nested dependencies for TE...
rake db:create                          # Creates the database from DATABAS...
rake db:drop                            # Drops the database from DATABASE_...
rake db:environment:set                 # Set the environment value for the...
rake db:fixtures:load                   # Loads fixtures into the current e...
rake db:migrate                         # Migrate the database (options: VE...
rake db:migrate:status                  # Display status of migrations
rake db:rollback                        # Rolls the schema back to the prev...
rake db:schema:cache:clear              # Clears a db/schema_cache.yml file
rake db:schema:cache:dump               # Creates a db/schema_cache.yml file
rake db:schema:dump                     # Creates a db/schema.rb file that ...
rake db:schema:load                     # Loads a schema.rb file into the d...
rake db:seed                            # Loads the seed data from db/seeds.rb
rake db:setup                           # Creates the database, loads the s...
rake db:structure:dump                  # Dumps the database structure to d...
rake db:structure:load                  # Recreates the databases from the ...
rake db:version                         # Retrieves the current schema vers...
rake dev:cache                          # Toggle development mode caching o...
rake import_csv:users                   # User CSVデータのインポート
rake initializers                       # Print out all defined initializer...
rake log:clear                          # Truncates all/specified *.log fil...
rake middleware                         # Prints out your Rack middleware s...
rake notes                              # Enumerate all annotations (use no...
rake notes:custom                       # Enumerate a custom annotation, sp...
rake restart                            # Restart app by touching tmp/resta...
rake routes                             # Print out all defined routes in m...
rake secret                             # Generate a cryptographically secu...
rake stats                              # Report code statistics (KLOCs, et...
rake test                               # Runs all tests in test folder exc...
rake test:db                            # Run tests quickly, but also reset db
rake test:system                        # Run system tests only
rake time:zones[country_or_offset]      # List all time zones, list by two-...
rake tmp:clear                          # Clear cache, socket and screensho...
rake tmp:create                         # Creates tmp directories for cache...
rake yarn:install                       # Install all JavaScript dependenci...

真ん中あたりに作成されたRakeタスクがあります。

コマンドの実行

user-no-MacBook-Pro:csv_data user$ rake import_csv:users

Rakeタスクは非常に便利な機能だと思ったのでもっと使ってみて学習していきたいです。

参考
https://qiita.com/yoshito410kam/items/26c3c6e519d4990ed739
https://qiita.com/suzuki_koya/items/787b5562d2ae1a215d94

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Railsでダミーのユーザーデータをたくさん用意する方法

3行で

  • いちいち新規作成などする手間を省く
  • seedファイルにデータを書き込む
  • ターミナルで raiks db:seed を実行

( ´∀`)<詳しく書きますね

ユーザーデータが複数必要なとき

たとえばインクリメンタルサーチの実装などで、データベースのUsersにたくさんデータがほしい場合があると思います。
そこでユーザーの新規作成(Sign Up)などでデータを作っていては時間がかかってしまいますね。

seeds.rbに作りたいデータを書き込みます

db/seeds.rbを編集します。

seeds.rb
p "create Users"
User.create!(
  email: 'user1@exam.com',
  password: 'aaaaaaaa',
  name: 'ぽーる',
  self_introduction: 'えへへ'
)
User.create!(
  email: 'user2@exam.com',
  password: 'aaaaaaaa',
  name: 'じょん',
  self_introduction: 'どーも'
)
.
.
.

1行目にはのちほどターミナルでコマンドを実行したときに表示させるための文字列を書いておきます。

次に テーブル名.create! を書きます。
それからカッコ内にユーザーの情報を書いていきますが、それぞれカラムに対応している項目にしてあげてください。必ずしも上の例と同じにはなりません。emailは重複しないように注意!

rails db:seed を実行

好きなだけユーザーとその情報を書いたら、ターミナルで rails db:seed を実行してください。
先ほど書いておいた create Users の表示とともに、ユーザーが作られています。データベースを確認してみましょう!

( ´∀`)<読んでくれてありがとう

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【初心者向け】bundler、Gemfile、Gemfile.lockの関係性について図でまとめてみた

Ruby on RailsでWebアプリケーション(以降ではRailsアプリと略します)を開発をするにあたり、gemの活用は開発効率をあげるために重要です。

Railsアプリ開発でgemを利用する機会は多くありますが、どのようにgemが管理されているかということについて理解をする機会は少ないかもしれません。

今回は『bundler』『Gemfile』『Gemfile.lock』といった、gemの管理を理解する上で重要な役割をもつ概念について紹介をしたいと思います。

2019年7月27日追記
@scivola さんにコメントで補足説明をしていただきました。
非常に参考になる内容ですので、こちらのコメントもぜひ読んでいただければと思います。

bundlerとは

『bundler』は依存関係にあるgemの依存関係やバージョンを管理してくれるgemです。

インストールしようとしているgem自身もほかのgemを利用しているケースがあります。その場合、依存関係にあるgemもあわせてインストールする必要があります。

また、各gemにはバージョンが設定されているのですが、同じgemでもバージョンが異なるとRailsアプリの挙動を変えてしまったり、他のgemに影響を与えてバグを発生させたりする可能性があります。

これらの問題を解決してくれるのがbundlerです。

bundlerを利用することで『依存関係にあるgemの一括インストール』『gemのバージョン管理』ができるようになります。

Gemfileとは

『Gemfile』とはRailsアプリで利用するgemの一覧を管理するファイルです。

『bundlerによってインストールされるgemはどこで管理されているのか?』
それが今から紹介するGemfileの役割です。

bundle installというコマンドでgemをbundlerを利用してインストールするのですが、その際にはGemfileに記載されているgemの一覧を参照し、まだインストールされていないgemがあればインストールを行います。

ですので、Railsアプリで新しくgemを追加したいという場合はGemfileにgemの名前を追記していくことになります。

Gemfile、bundleコマンド、gemの関係性および処理の流れを図で表現すると以下のようになります。
gemfile-overview-880.png

Gemfile.lockとは

『Gemfile.lock』はGemfileをもとに実際にインストールされたgemの一覧とバージョンが記載されたファイルです。

Gemfile.lockには依存関係にあるgemも含め、bundlerによってインストールされた全てのgemとそのgemのバージョンが記載されています。

Gemfile.lockはGemfileをもとにbundlerによってインストールされたgemの結果を出力するファイルです。そのため、基本的には手動で更新することはありません。
bundle installもしくはbundle updateをすることでGemfile.lockは自動で更新されます。

Railsアプリにインストールされたgemと、Gemfile.lockの関係性を図で表現すると以下のようになります。

gemfilelock-overview-1024x780.png

GemfileとGemfile.lockの比較

GemfileとGemfile.lockの違いについて表にすると以下のようになります。

Gemfile Gemfile.lock
記載されているgem bundlerでインストールするgem bundlerでインストールしたgem
更新タイミング bundleコマンド実行前 bundleコマンド実行後
更新方法 手動更新 自動更新

『Gemfileの内容をもとにbundlerがgemをインストール → インストールしたgemの結果をGemfile.lockに記載』という一連の流れを図としてまとめると以下のようになります。

bundle-gem-overview-880.png

さいごに

以上でRailsアプリにおける、bundler、Gemfile、Gemfile.lockの役割の紹介および図解を終わります。

詳細については『Gemfile?bundler?Rails開発するなら理解しておきたいgem管理の基礎知識』で紹介していますので、興味のある方はご覧になってください。

ツイッター(@nishina555)やってます。フォローしてもらえるとうれしいです!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

RailsでCSVダウンロード後の画面のリロード

あるデータの一覧のCSVダウンロードした後に画面の情報が変わっていることを確認させる必要があったときの開発メモ。

controllerからだとリダイレクトは出来ない。

自分の考えとしてはcontroller内のアクションにダウンロードした後にリダイレクトをさせれば良いと考え以下のように記載。

def download
    respond_to do |format|
      format.csv do
        send_data render_to_string, filename: "#{__method__}_#{Time.zone.now.strftime('%Y%m%d')}.csv", type: :csv
      end
    end
    redirect_to hoge_url
end

ただこれだとDouble renderとなり起こられてしまう。

解決 jsでリダイレクトさせる

slim

.text-right
  = link_to 'CSV', download_path(format: :csv),
    class: 'btn btn-link', id:'download-csv', target: '_blank'

js

  $('#download-csv').click -> location.reload()

参考: http://tshidax.hatenablog.com/entry/2017/09/11/120000

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ActiveSupportのslice!メソッドがトリッキーな動きをする

経緯

ActiveRecordのvalidationメソッドを読んでいて出てきたActiveSupporのslice!メソッドがトリッキーと自分には感じる動きをしたので書いた。
Railsはv5.2.3。
【PR】ちなみにこういうったコードリーディングの勉強会をよく開催しているので興味ありましたらこちらのリンクを見てね!過去開催例はこちら

概要

  • sliceメソッドの動作はこうなります。引数に渡されたkeyをHashとして返します。またもちろんレシーバーには影響はありません。
[43] pry(main)> require 'active_support'
=> true
[44] pry(main)> require 'active_support/core_ext'
=> true
[60] pry(main)> some_hash = {
[60] pry(main)*   key_a: "some content",  
[60] pry(main)*   key_b: "some content",  
[60] pry(main)*   key_c: "some content"  
[60] pry(main)* }  
=> {:key_a=>"some content", :key_b=>"some content", :key_c=>"some content"}
[61] pry(main)> some_hash.slice(:key_a, :key_b)
=> {:key_a=>"some content", :key_b=>"some content"}
[62] pry(main)> some_hash
=> {:key_a=>"some content", :key_b=>"some content", :key_c=>"some content"}
  • 一方slice!メソッドはこうなります。引数に渡されたkeyをHashとして返ってきて、渡されなかったものがレシーバーから消されるのかな、と思ったらその逆でした。渡されなかったkeyのHashが返ってきて、返ってきたものはレシーバーから消されます。言い換えると、引数にはレシーバーに残したいkeyを指定するということになります。
[63] pry(main)> some_hash.slice!(:key_a)
=> {:key_b=>"some content", :key_c=>"some content"}
[64] pry(main)> some_hash
=> {:key_a=>"some content"}

コードを見てみる

sliceメソッドのコードと、slice!メソッドのコードを見るとそう書いてあるので、なるほどという感じ。

参考

https://qiita.com/mah_lab/items/ed10bae99105ea2fd8bd

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Web教材プレ

今回の学習

1-1. 教材の進め方
1-2. Webコース学習の流れ
1-3. Webコースで用いるツールを準備しよう!
1-4. 開発環境を整えよう!
1-5. 【必読】Windowsユーザの心構え
1-6. 開発の心得

はじめに

みなさんGeekSalonのWebサービス開発コースへようこそ!
これから共に勉強し、Webプログラミングをしていきましょう!
ここでは本教材の進め方について説明します!

本教材について

本教材は各テーマごとに章立てされていて、基本的に順番に進めてもらえればOKです!
各章の内容は以下の通り。

1章 GeekSalonについて
GeekSalonやWebコースについての説明、Webサービス開発の前提知識。

2章 フロントエンド入門
Webサイトの見た目作りの前提知識。

3章 バックエンド
Webサイトの裏側作りの前提知識。

4章 フロントエンド
Webサイトの見た目作りの基本を学習。

5章 オリジナル開発の流れ
オリジナルサービス開発の流れの説明。

6章 追加教材
自分のプロダクト開発に活用できる応用技術などを学習。

7章 新教材(β版)
Webサイトの裏側作りの仕組みをより理解する。

教材の学習方法

Webサービス開発はシステムの動きが重要であるため、章を通して学習する必要があります。
1つのページにとどまって悩み続けるよりも、最初はどんどん先に進みましょう。その章が終わった時に振り替えると、悩んでいたところが解決するかもしれません。
特に5章では難しい点がありますので、何周も学習しましょう。

下の学習の目安を参考にして自分の忙しさを加味しながら進めていきましょう。

〜1ヶ月目〜
1週間目 1章と2章
はじめに3ヶ月の概略を確認し、勉強していく準備をして教材進行の目処を立てましょう。
次に基本となるHTMLについて勉強しましょう。

2〜3週間目 3章と4章
ここではRailsについて勉強します。
3章で概念的な事柄をざっくり解説し実際に手を動かしてRailsの仕組みを理解していきます。
難しい内容が含まれているところなので2週3週してきちんと理解するようにしましょう。
7章ではより実践的な機能を含めた内容が解説されています。時間に余裕のある人や物足りない人はやってみましょう。
4章ではページの見た目の仕組み・その作り方について勉強していきます。時間が取れない人は3章を優先して勉強しましょう。

4週間目 5章
2ヶ月目から始まる自分のプロダクト開発に向けて、5章を読んで企画面談の準備をしましょう。
ここでの準備が後の2ヶ月の基盤を作るのでしっかり準備しましょう。

〜2ヶ月目〜
1週間目 7章
ここでは3章でやった内容をより実践的に学習していきます。
自分の企画開発を行う上で必要な技術がたくさん詰まっているので、3章の復習も兼ねてかっちり勉強しましょう。

2週間目 6章
6章は様々な機能についての追加教材となっています。自分のプロダクトに活用できそううなものがあったらぜひ勉強してみましょう。

追加教材について 
6章は主に自分のプロダクト開発に役立つ追加教材となってます。企画の目処がつき次第参考にしましょう。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Strong Paramertersについてまとめてみた

はじめに

Railsで開発をする際に、セキュリティを高める方法のひとつとしてStrong Patamertersがあります。今回はStrong Patamertersの使い方について調べてみました。間違っている部分ありましたらご指摘いただければと思います。

Strong Patamertersとは

モデルの便利な機能に、複数の属性を一括代入できる機能があります。例えば次のようなコードではUserオブジェクトを生成する際に、nameとemailという2つの属性値を一括で代入しています。

Railsコンソール
> user = User.new(name: '田中太郎', email: 'taroutanaka@gmail.com')

もしこの機能がなければ、

Railsコンソール
> user = User.new
> user.name = '田中太郎'
> user.email = 'taroutanaka@gmail.com'

と書く必要があるので少々面倒ですね。

またコントローラーで受け取ったパラメーターの一部を次のように直接モデルに渡して複数の属性を一括で取り出すこともできます。

Railsコンソール
> user = User.new(params[:user])

しかしここにセキュリティ上の危険が潜んでいます。パラメーターに意図せぬ属性が紛れ込んでいるときに、想定外の属性についても登録・更新が行えてしまう問題が生じます。

例えば、Userには有料ユーザーか無料ユーザーを判別するpremiumフラグを持っているとします。このような場合、有料ユーザーでなくてもサーバーに送るリクエスト・パラメーターを加工して、premiumフラグが無課金になるようなリクエストを送ることが技術的には可能です。

これを防ぐためにはパラメーターのどの属性を許可してどの属性を許可しないのかを制御する必要があります。この時に利用できるのがStrong Parametersという機能です。

コントローラーファイル
user_params = if user.premium
  #specialは有料ユーザーのみ使える
  params.require(:user).permit(:name, :email, :special)
else
  params.require(:user).permit(:name, :email)

User.new(user_parmas)

これで許可しない属性情報を無視することができます。

おわりに

Raislには様々なセキュリティを高める機能が用意されています。開発者側がセキュリティを高める方法を理解し、安心して使えるサービスを作る必要がると思います。今後も勉強を続けて行きたいと思います。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Railsの日本語化、ヘルパーメソッドで呼べるようにする。

はじめに

Rails 国際化 (i18n) API
RubyのI18n (国際化・多言語化を意味する internationalization を短縮したもの) gemはRuby on Rails 2.2以降からRailsに同梱されています。このgemは、アプリケーションの文言を英語以外の 別の1つの言語に翻訳 する機能や 多言語サポート 機能を簡単かつ拡張可能な方式で導入するためのフレームワークを提供します。
Railsガイドより

Railsのデフォルトはエラーメッセージ一つにしても英語表記であり、日本語サービスを開発するのであれば、日本語対応になるよう実装しなくてはならない。

user.rb 
validates :name, presence: true
=> name can't be blank #英語表記になってしまう。

日本語化対応にするためには設定(参考サイトはこちら)が必要であり、ある程度の日本語化対応のための日本語メッセージを集約したファイル(参考サイトはこちら)も存在する。
またこのファイルはエラーメッセージ以外にもヘルパーメソッドを使って呼び出すこともできる。

Railsの日本語化、ヘルパーメソッドで呼べるようにする。

- submit_name = user.new_record? ? t('view.new') : t('view.update')

= form_for(@user) do |f|
  = f.label :name
  = f.text_field :name

  = f.label :email
  = f.email_field :email

  = f.submit submit_name

ユーザーを生成、更新するフォームであるが

ja.yml
ja:
  application_name: Trecon-App
  ~~~ 省略 ~~~
  view:
    title: Trecon-App
    header:
      logout: ログアウト
      login: ログイン
      my_menu: マイメニュー
      profile: プロフィール
      note: ノート
    new: 作成  <====  ここ
    edit: 編集  <====  ここ
    update: 更新

と編集して、t('')メソッドで呼び出すことで、

- submit_name = user.new_record? ? t('view.new') : t('view.update')
t('view.new') : t('view.update')

ユーザーが新しく生成される場合は'作成', ユーザー情報を更新する場合は'更新'と表示されるようになる。
userフォームだけでなく、その他のデータベースの作成、更新に意味合いが同じであれば、このヘルパーメソッドを使えば使い回せるようになる。

<% provide(:submit, "作成") %>
<%= yield(:submit) %>

他にもprovideとyieldを組み合わせて送信ボタンの名称を変える方法があるが、
userフォームのupdateは'更新'
micropostフォームのupdateは'更新する'

と同じ意味合いなのに若干違う文が生まれるので、それだったら一つのファイルに統一させてコンポネート化させた方がいい。

参考

Railsガイド
Railsで日本語サービスを作るときのテンプレート
svenfuchs/rails-i18n

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

本番環境・開発環境に合わせたアセットパイプライン

アセットパイプラインとは

JavaScriptやCSSのアセットを最小化 (minify: スペースや改行を詰めるなど) または圧縮して連結するためのフレームワークです。
Railsガイドより

 Railsではassets/以下にそれぞれimageやjavascript, stylesheetsのフォルダが分けられている(以下javascriptを例に)。
 しかし開発環境だと、javascript/application.js、stylesheets/application.cssこの一つのファイルにまとめて記述をすれば、規模が大きくなるほどどのviewに対しての記述があるのかが分からない。また一つのファイルにまとめて記述すれば、変数名が重複してしまう。
 そのためassets/javascript/users, assets/javascript/notes/などフォルダごとに分けられているのが好ましい。最終的にはこのフォルダごとに分けられたjavascriptのファイルを、最終的に一つのファイルにまとめてviewを表示する(コンパイル)。この仕組みを アセットパイプライン という。

本番環境では

 しかし本番環境(heroku, AWSなど)にデプロイすると処理速度に対する影響を防ぐために
自動でコンパイルが行われない。なので
①自動でコンパイルを行うよう設定を変える
②アセットプリコンパイル(あらかじめコンパイルするファイルを指定する)を行う
どちらか2つの方法を設定する必要がある。

①の方法

config/production.rb
config.assets.compile = true #=> falseをtrueに

②の方法

assets/javascripts/application.jsで

//= require jquery_ujs
// require_tree . => '='を削除
//= require common

まずはこれでjavascripts/以下のjsファイルを読み込めなくする。

なぜ?

= require_tree.の状態だと、フォルダごとに分けていたjsファイルをapplication.jsにまとめて記述するので、変数名が重複してしまうから。

続いて

assets/javascripts/users/form.jsを作成したとする。
そして、そのform.jsを適用したいviewファイルに以下の追記をする。

views/users/form.html.slim

~ここにviewのコードが入る~

= javascript_include_tag 'users/form' <= form.jsを適用するよう指定する。

そしていざ、本番環境で実装する際にあらかじめjsファイルをコンパイルするよう指定する(プリコンパイル)。

config/initializers/assets.rb

Rails.application.config.assets.precompile += %w(users/form.js)

以上!

参考

Railsガイド

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

本番環境に合わせたアセットパイプライン

アセットパイプラインとは

JavaScriptやCSSのアセットを最小化 (minify: スペースや改行を詰めるなど) または圧縮して連結するためのフレームワークです。
Railsガイドより

 Railsではassets/以下にそれぞれimageやjavascript, stylesheetsのフォルダが分けられている。(以下javascriptを例に)
 しかし開発環境だと、javascript/application.js、stylesheets/application.cssこの一つのファイルにまとめて記述をすれば、規模が大きくなるほどどのviewに対しての記述があるのかが分からない。また一つのファイルにまとめて記述すれば、変数名が重複してしまう。
 そのためassets/javascript/users, assets/javascript/notes/などフォルダごとに分けられているのが好ましい。最終的にはこのフォルダごとに分けられたjavascriptのファイルを、最終的に一つのファイルにまとめてviewを表示する(コンパイル)。この仕組みを アセットパイプライン という。

本番環境では

 しかし本番環境(heroku, AWSなど)にデプロイすると処理速度に対する影響を防ぐために
自動でコンパイルが行われない。なので
①自動でコンパイルを行うよう設定を変える
②アセットプリコンパイル(あらかじめコンパイルするファイルを指定する)を行う
どちらか2つの方法を設定する必要がある。

①の方法

config/production.rb
config.assets.compile = true #=> falseをtrueに

②の方法

assets/javascripts/application.jsで

//= require jquery_ujs
// require_tree . => '='を削除
//= require common

まずはこれでjavascripts/以下のjsファイルを読み込めなくする。

なぜ?

= require_tree.の状態だと、フォルダごとに分けていたjsファイルをapplication.jsにまとめて記述するので、変数名が重複してしまうから。

続いて

assets/javascripts/users/form.jsを作成したとする。
そして、そのform.jsを適用したいviewファイルに以下の追記をする。

views/users/form.html.slim

~ここにviewのコードが入る~

= javascript_include_tag 'users/form' <= form.jsを適用するよう指定する。

そしていざ、本番環境で実装する際にあらかじめjsファイルをコンパイルするよう指定する(プリコンパイル)。

config/initializers/assets.rb

Rails.application.config.assets.precompile += %w(users/form.js)

以上!

参考

Railsガイド

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

デフォルトで用意されているエラーメッセージを個別に管理できるようにする。

はじめに

Railsのバリデーションのエラーメッセージには

presence => 'を入力してください'
uniqueness => 'はすでに存在します'
length => 'は○文字以上入力してください'

などデフォルトで用意されているものがあり、このメッセージを個別で管理できる方法をまとめてみた。

その前に

Userモデルにname(名前)があり、これにバリデーションをかけていくとする。

①ja.ymlファイルにメッセージを書く。

user.rb
validates :name, presence: true

と記述し、日本語化対応のためのファイル(ja.yml)にエラーメッセージを記述する。

ja.yml
ja:
  activerecord:
    attributes:
      user:
        name: 名前
    errors:
      models:
        user:
          attributes:
            name:
              blank: は確実に入力してください。<== ここ

コンソールでは、

irb(main):006:0> user = User.new
=> #<User id: nil, name: nil, created_at: nil, updated_at: nil>
irb(main):007:0> user.valid?
=> false
irb(main):008:0> user.errors.full_messages
=> ["名前は確実に入力してください。"]

と上記のようになる。

②モデルでのバリデーションの記述にメッセージも書く。

先ほどのuser.rbには

user.rb
validates :name, presence: true #だけだったが
                  
validates :name, presence: { message: 'はぜったいに書いてください。' }

と書く。
コンソールでは、

irb(main):017:0> user = User.new
=> #<User id: nil, name: nil, created_at: nil, updated_at: nil>
irb(main):018:0> user.valid?
=> false
irb(main):019:0> user.errors.full_messages
=> ["名前はぜったいに入力してください。"]

となる。この時、ja.ymlに

ja.yml
ja:
  activerecord:
    attributes:
      user:
        name: 名前
    errors:
      models:
        user:
          attributes:
            name:
              blank: は確実に入力してください。<= ここ

と記述されていた場合、ja.ymlで記述したメッセージの方が優先されるので注意。

errors[:base]を使ってバリデーションごとオリジナルのものを作成する。

errors[:base]とは?=> リンク
デフォルトで用意されたバリデーションのエラーメッセージでも例えば
"名前を入力してください"ではなく
"絶対に名前を入力してください"
とattribute(属性) + message(メッセージ)の順番ではなく
message(メッセージ) + attribute(属性) + message(メッセージ)と自由に記述したい場合
があったとする。この時使えるのはerrors[:base]である。

use.rb
#validate(この時単数形なので注意!)は個別にモデルの検証を定義したい時、上書きする
  validate :email_presence

  #モデルに直接書き込む。
  def email_presence
    errors[:base] <<  "絶対にメールアドレスは入力してください。" if email.blank?
  end

コンソールには

irb(main):021:0> user = User.new
=> #<User id: nil, name: nil, created_at: nil, updated_at: nil>
irb(main):022:0> user.valid?
=> false
irb(main):023:0> user.errors.full_messages
=> ["絶対にメールアドレスは入力してください。"]

と表示される。

※個別で管理 vs まとめて管理

ja.ymlで

ja.yml
ja:
  activerecord:
    attributes:
      user:
        name: 名前
    errors:
      models:
        user:
          attributes:
            name:
              blank: は確実に入力してください。#=> Userのnameに対して

  errors:
    format: "%{attribute}%{message}"
    messages:
      blank: を入力してください。#=> presence: trueと記述されたもの全て

と個別に管理した場合と、まとめて管理した場合には

irb(main):033:0> user = User.new
=> #<User id: nil, name: nil, email: nil, created_at: nil, updated_at: nil>
irb(main):034:0> user.valid?
=> false
irb(main):036:0> user.errors.full_messages
=> ["名前は確実に入力してください。"]

と個別で管理していた方が優先となっていた。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

rails rspec 非同期通信のためのテストコード[備忘録]

rails rspec 非同期通信のためのテストコード

非同期通信のためのテストコードを書くときに少し詰まったので解決策をメモしておきます。

環境

  • rails 2.5.3

 コード

require 'rails_helper'

RSpec.describe 'Messages', type: :request do

  let(:user) { create(:user, :with_message_group) }
  let(:params) { { message: { message: "good"} } } 
  before do
    sign_in(user)
  end

  describe "create message" do

    it "create message" do
      post message_group_messages_path(message_group_id: user.message_groups.first.id), xhr: true, params: params
    end
  end

end

ポイントは下のコードの部分です。

    it "create message" do
      post message_group_messages_path(message_group_id: user.message_groups.first.id), xhr: true, params: params
    end

xhr: trueにすることで非同期通信でテストができます。

また文法の面でも詰まったのでそこも少し。

    it "create message" do
      post message_group_messages_path(message_group_id: user.message_groups.first.id), xhr: true, params
    end

最初paramsのところをこんな感じに書いていたのですが、シンタックスエラーが出てました。エラー文読んでもわからなくて冷静に見直したら

params: params

このように書かないといけないですね、気をつけないと。

 参考

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【rails】リロードしないとインクリメンタルサーチが動かない時はこれ(turbolinksの無効化)

インクリメンタルサーチを実装したのに、
リロードしないと反応しないじゃん!!

ってなったので調べました。

原因はrails5で標準インストールされるturbolinksにあるようです。
(turbolinksについてはこちらの記事を→https://qiita.com/saboyutaka/items/bb089e8208239bf6fdc0)

とりあえず、今回はアプリケーション全体でturbolinksを無効化したかったわけではなく、
リンク先だけで無効化したかったので、以下のように記述して解決しました。

index.html.haml
中略
 = link_to edit_group_path(@group) do
   .main-header__edit-btn{"data-turbolinks": "false"}
     Edit

参考リンク

https://ryoutaku-jo.hatenablog.com/entry/2019/01/15/213420

https://qiita.com/Cheekyfunkymonkey/items/216bf7426493e6213927

https://qiita.com/hiroyayamamo/items/b258acbaa089d9482c8a

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

pryの結果を保存して再実行したい気分

なにこれ

pryの結果をファイルに保持し、再度実行することができる。
再実行後は変数に値が入るため、複雑な処理を必要とするデバッグの際に手順をファイル化しておくことが可能。

手順

スクリプト配置

このスクリプトをプロジェクト直下またはホームディレクトリの .pryrc に配置する

記録

[1] pry(main)> ReRe.start
20190727021128.rb
=> :dubbing
[2] pry(main)> p 1111
1111
=> 1111
[3] pry(main)> user = User.first
=> #<User:0x00007fda
...
[4] pry(main)> ReRe.stop
[5] pry(main)> exit

実行

[1] pry(main)> ReRe.playback("20190727021128.rb")
run command... 
[2] pry(main)> user
=> #<User:0x00007fda
...
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

pryのコマンドを保存して再実行したい気分

なにこれ

pryのコマンドをファイルに保持し、再度実行することができる。
再実行後は変数に値が入るため、複雑な処理を必要とするデバッグの際に手順をファイル化しておくことが可能。

手順

スクリプト配置

このスクリプトをプロジェクト直下またはホームディレクトリの .pryrc に配置する

記録

[1] pry(main)> ReRe.start
20190727021128.rb
=> :dubbing
[2] pry(main)> p 1111
1111
=> 1111
[3] pry(main)> user = User.first
=> #<User:0x00007fda
...
[4] pry(main)> ReRe.stop
[5] pry(main)> exit

実行

[1] pry(main)> ReRe.playback("20190727021128.rb")
run command... 
[2] pry(main)> user
=> #<User:0x00007fda
...

ファイル保存先

実行ディレクトリ以下の tmp/rere/*.rb

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

gemをインストールした後にエラーになったら

gemをインストールした後にエラーになったら

RubyonRailsで開発中、上記のようになった場合・・・

結論:サーバーを再起動しましょう!!!!!!(自戒)

erbをhamlに変換しようと、

gem 'haml-rails'
gem 'erb2haml'

をgemfileに追加し、

rake haml:replace_erbs

をした後、ビューを開くと、ActionController Missingtempleteエラーに

gemをinstallした後は必ずサーバー再起動しましょう!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む