Rails5でnested attribute使うときは気をつけろ
Rails5はモデルまわりの変更が多い気がする。
やりたかったのは、以下のモデルで
class Report < ApplicationRecord has_one :operator accepts_nested_attributes_for :operator, allow_destroy: true end class Operator < ApplicationRecord belongs_to :report end
こんな感じでviewで保存すると、
<%= f.fields_for :operator, @report.operator || @report.build_operator do |of| %> <%= render partial: "operator_form", locals: {of: of } %> <% end %>
なぜかバリデーションエラーでDBに保存できなくなる問題。
いや、StrongParameterちゃんと書いてるし、パラメータちゃんと受け取ってるやん・・・。
解決策は、belongs_toにoptionalでtrueを宣言してあげる。
rails5ではデフォルトでfalseになってしまってるみたい。なんなんそれ・・・。
class Operator < ApplicationRecord belongs_to :report, optional: true end
Rails5におけるdevise_parameter_sanitizer.forエラー
deviseではデフォルトでemailとpasswordの値しか保存できないが、applicationコントローラに以下メソッドを追加してあげるとよい。
class ApplicationController < ActionController::Base before_action :configure_permitted_parameters, if: :devise_controller? # なんらかの処理 private def configure_permitted_parameters devise_parameter_sanitizer.permit(:sign_up, keys: [:name]) end end
ちなみにこれはrails5での処理。
rails4までだと
devise_parameter_sanitizer.permit(:sign_up, keys: [:name])
のところを
devise_parameter_sanitizer.for(:sign_up) << :name
と書くらしい。
Rails5で「forってメソッドしらん!」と怒られたのでメモ。
Ruby on railsで別ウインドウ表示
htmlで
<a href="xxx.html" target="_blank">リンク</a>
みたいな書き方があるけど、railsってどうやって書くんだっけ、と調べた結果、
<%= link_to "リンク", URL_PATH, :target=>["_blank"] %>
これだけでいいらしい。簡単。
branchをmergeする話
Gitとかでbranch作ってmergeってよくやる機会があるけど
なぜかmergeの仕方を忘れたりするからメモ。
git checkout master git merge [branch名] git push origin master