- 投稿日:2019-07-27T23:31:52+09:00
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 endRailsでは、デフォルトで設定されている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:usersRakeタスクは非常に便利な機能だと思ったのでもっと使ってみて学習していきたいです。
参考
https://qiita.com/yoshito410kam/items/26c3c6e519d4990ed739
https://qiita.com/suzuki_koya/items/787b5562d2ae1a215d94
- 投稿日:2019-07-27T20:07:32+09:00
Railsでダミーのユーザーデータをたくさん用意する方法
3行で
- いちいち新規作成などする手間を省く
- seedファイルにデータを書き込む
- ターミナルで
raiks db:seed
を実行( ´∀`)<詳しく書きますね
ユーザーデータが複数必要なとき
たとえばインクリメンタルサーチの実装などで、データベースのUsersにたくさんデータがほしい場合があると思います。
そこでユーザーの新規作成(Sign Up)などでデータを作っていては時間がかかってしまいますね。seeds.rbに作りたいデータを書き込みます
db/seeds.rbを編集します。
seeds.rbp "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
の表示とともに、ユーザーが作られています。データベースを確認してみましょう!( ´∀`)<読んでくれてありがとう
- 投稿日:2019-07-27T17:40:15+09:00
【初心者向け】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.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の関係性を図で表現すると以下のようになります。
GemfileとGemfile.lockの比較
GemfileとGemfile.lockの違いについて表にすると以下のようになります。
Gemfile Gemfile.lock 記載されているgem bundlerでインストールするgem bundlerでインストールしたgem 更新タイミング bundleコマンド実行前 bundleコマンド実行後 更新方法 手動更新 自動更新 『Gemfileの内容をもとにbundlerがgemをインストール → インストールしたgemの結果をGemfile.lockに記載』という一連の流れを図としてまとめると以下のようになります。
さいごに
以上でRailsアプリにおける、bundler、Gemfile、Gemfile.lockの役割の紹介および図解を終わります。
詳細については『Gemfile?bundler?Rails開発するなら理解しておきたいgem管理の基礎知識』で紹介していますので、興味のある方はご覧になってください。
ツイッター(@nishina555)やってます。フォローしてもらえるとうれしいです!
- 投稿日:2019-07-27T16:51:59+09:00
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()
- 投稿日:2019-07-27T15:48:18+09:00
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!メソッドのコードを見るとそう書いてあるので、なるほどという感じ。
参考
- 投稿日:2019-07-27T12:42:24+09:00
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章は主に自分のプロダクト開発に役立つ追加教材となってます。企画の目処がつき次第参考にしましょう。
- 投稿日:2019-07-27T10:29:12+09:00
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には様々なセキュリティを高める機能が用意されています。開発者側がセキュリティを高める方法を理解し、安心して使えるサービスを作る必要がると思います。今後も勉強を続けて行きたいと思います。
- 投稿日:2019-07-27T10:01:29+09:00
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.ymlja: 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は'更新する'と同じ意味合いなのに若干違う文が生まれるので、それだったら一つのファイルに統一させてコンポネート化させた方がいい。
参考
- 投稿日:2019-07-27T09:58:27+09:00
本番環境・開発環境に合わせたアセットパイプライン
アセットパイプラインとは
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)以上!
参考
- 投稿日:2019-07-27T09:58:27+09:00
本番環境に合わせたアセットパイプライン
アセットパイプラインとは
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)以上!
参考
- 投稿日:2019-07-27T09:55:21+09:00
デフォルトで用意されているエラーメッセージを個別に管理できるようにする。
はじめに
Railsのバリデーションのエラーメッセージには
presence => 'を入力してください' uniqueness => 'はすでに存在します' length => 'は○文字以上入力してください'などデフォルトで用意されているものがあり、このメッセージを個別で管理できる方法をまとめてみた。
その前に
Userモデルにname(名前)があり、これにバリデーションをかけていくとする。
①ja.ymlファイルにメッセージを書く。
user.rbvalidates :name, presence: trueと記述し、日本語化対応のためのファイル(ja.yml)にエラーメッセージを記述する。
ja.ymlja: 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.rbvalidates :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.ymlja: 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.ymlja: 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 => ["名前は確実に入力してください。"]と個別で管理していた方が優先となっていた。
- 投稿日:2019-07-27T08:12:58+09:00
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 endxhr: 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このように書かないといけないですね、気をつけないと。
参考
- 投稿日:2019-07-27T07:06:23+09:00
【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
- 投稿日:2019-07-27T02:24:13+09:00
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 ...
- 投稿日:2019-07-27T02:24:13+09:00
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
- 投稿日:2019-07-27T01:35:10+09:00