poyopoyo0のブログ

poyopoyoのブログ

Web 関連のメモ書きブログです。

【 Rails 】View から Controller に値を受け渡すには

Controller から View に値を受け渡すには、 Controller で値を定義してやればいいだけなのだけど、今度は逆に View から Controller に値を受け渡したいときはどのようにやればいいか、長いこと謎だった。

こちら stackoverflow.com の Answer を見て、ようやく値の受け渡し方が分かったので、メモ書き。

View に

link_to "リンク名", アクション名_コントローラー名_path(受け渡したい変数の名前)

と書いて、 Controller のアクションに

def アクション名
  params[:該当するparam名]
end

と書いてやれば、値の受け渡しができる。

具体的に今回は

View:

link_to "リンク名", new_report_path(@report)

Controller:

def new
  @report = Report.new
  @report = Report.find_by(id: params[:format])
end

としてやれば、値を取得することができた。

params の中に何を入れてやればいいか分からないときは、 Controller 側に binding.pry を入れて Pry コンソールを立ち上げた後 params と打ち込めば

[1] pry(#<ReportsController>)> params
=> {"action"=>"new", "controller"=>"reports", "format"=>"4"}

のように表示してくれるので、受け渡して欲しい値の変数名を探す。今回は format がそれらしき変数名なので、 Controller に params[:format] と打ち込むと View 側の @report の id を受け取ることができた。

受け渡す値の名前を明示したり、複数の値を受け渡したいときは、 こちら sandragon.hatenablog.com を参考にして

View:

link_to "リンク名", new_report_path(:report_id => @report.id, :params_controller => params[:controller])

Controller:

def new
  @report = Report.new
  @report = Report.find_by(id: params[:report_id])
  @params_controller = params[:params_controller]
end

のようにアロー記法で書いてやればいい。

【 Rails 】capybara と capybara-webkit は別物

@komagata さんが capybara や capybara-webkit などの言葉の定義を esa のコメント欄で書かれていたので、メモらせてもらいます。

通常 capybara と言った場合は、テストのための DSL とその仕組自身のことを指し、それぞれの driver が selenium 、 capybara-webkit 、 rack_test などになる。 driver として capybara と言った場合はわかりづらいが、普通は rack_test のことだと思われてしまう。

【使用例】: テストが selenium では通るが capybara-webkit (もしくは webkit )では通らない

【 Ruby 】文字列をメソッドオブジェクトに変換したいときは

Ruby スクリプトの作成中に、文字列をメソッドオブジェクトに変換してくれるメソッドが欲しくなった。 さすがの Ruby も、そんな奇天烈なメソッドは存在しないよな~、と思っていたら、なんと 存在していた

Ruby send メソッド : 備忘録にしたい

どうやら send("methodName") という書き方で methodName というメソッドを呼び出せるらしい。 す、すごい、こんなメソッドがあるなんて。これ、相当便利なメソッドなんじゃないかな…。

attr_accessor と並んで、 send メソッドも、今後大いにお世話になりそう。 Ruby って、どこまで懐が深いんだ。。。

【正規表現】用途に応じて、手っ取り早く逆引きしたいときは

伊藤淳一さんの Qiita の記事 qiita.com が流れてきてたけど、用途に応じて手っ取り早く逆引きしたいときは、こちらの記事 qiita.com も便利。

自分のレベルでは、取り敢えずここに書かれている内容で大丈夫かな…、という感じです。

【 Rails 】development 環境の DB の中身を覗くには

development 環境で SQLite を使っている場合、データ入力がきちんとできているかどうか確認するために、この記事 qiita.com と、この記事 d.hatena.ne.jp を参考にした。具体的には

$ bundle exec rails db

と入力した後、 sqlite の画面に切り替わるので、そこで

sqlite> .databases
sqlite> .tables
sqlite> select * from <目的のテーブル名>;

としてやれば、目的のテーブルに値がきちんと入力されているかどうかの確認ができる。

【 Rails 】 $ rake db:setup した後で、別の seed データを DB に新たに追加したいときは

development 環境で $ rake db:setup した後で、別の seed データを DB に追加したいときがある。

db/fixtures/テーブル名.yml に seed データを入力した後、再度 $ rake db:setup を実行してもいいのだが、既に手動で入力しているデータがあった場合、 $ rake db:setup を実行してしまうと、手動で入力したデータがリフレッシュされてしまう。 手動で入力したデータを生かしつつ、新たに別のデータを DB に追加したいときは、以下のようにする。

lib/tasks/ ディレクトリに、適当な名前の rake task を作成する(ここでは仮に lib/tasks/interns.rake としておく)。

例えば reports データを追加したい場合は、 lib/tasks/interns.rakeintern:import_reports を作成して、 db/fixtures/reports.yml に seed データを入力する。その後、

$ bundle exec rake intern:import_reports

と実行すれば、 seed データが DB に追加される。

※ DB に SQLite を使っていた場合、 rake コマンドの実行の前に、一旦 Rails を停止しておかないといけないかも。

※ ちなみに、この方法は production 環境でも使える。 production 環境で追加データを挿入したくなったときには便利かも。

【 Rails 】Rails プロジェクトに新規画面を追加するには

例えば reports 画面を新たに追加したい場合は

$ bundle exec rails g controller reports index show new edit
$ bundle exec rails g model report

と打ち込んだ後、 migration を修正して

$ bundle exec rake db:migrate

を実行してやればOK。

上のコマンドを実行する上で以下の記事を参考にした。 qiita.com www.rubylife.jp www.atmarkit.co.jp maeharin.hatenablog.com

また、ここの説明 d.hatena.ne.jp も大変参考になった。

【 Git コマンド】作業ブランチと master ブランチの diff をまとめて表示するには

通常、 $ git diff コマンドだと、ステージング前後の diff や commit 単位の diff は表示できても、ブランチ単位の diff をまとめて表示することができない。

それを表示するには

$ git diff master...作業ブランチ名

としてやれば、作業ブランチと master ブランチの、全体の diff を表示できる

参照: Git - プロジェクトの運営