Ruby on Railsのパーシャルとnew_record?メソッドを利用しフォームを簡素化する

登録フォームを設定している場合、newとeditの項目が同じ場合があります。
項目を統一しDRYにコーディングする方法は様々ですが、 今回Ruby on Railsの部分テンプレートである partial(パーシャル)機能と new_record?メソッドを利用し、DRYにフォームを作成できます。
手順
1:newページのフォームとeditページのフォームを共通のパーシャルフォームに遷移させる。
2:newとeditページで共通のパーシャルを設定し、そのパーシャル内でnew_record?メソッドにより送信先のパスを変更します。
手順が前後しますが、まずnew_record?は何かを解説します。
new_record?メソッドについて
new_record?はDBにレコードが登録されて「いなければ」true 登録されていればfalseになります。
例
article = Article.new article.new_record? # => true
このnew_record?をパーシャルに設定します
パーシャルの設定
今回はformパーシャルを設定します。
ディレクトリ構造は下記です。
view-----articles |--new.slim.html |--edit.slim.html |--_form.slim.html
newとeditのページはそのまま残し、 == renderでパーシャルへ遷移させるように変更します。
new.slim
== render 'form'
edit.slim
== render 'form'
上記でnewとeditのページからパーシャルの呼び出しが可能になりました。
_formのパーシャル
_form.slim - url = @article.new_record? ? artices_path : article_path = simple_form_for(@article, url: url) do |f| = f.input :publish_time = f.input :title = f.submit, "送信"
- url について
- url = @article.new_record? ? artices_path : article_path
上記でarticespathはcreateアクションのpathで articlepathはupdate pathになります。 ここを任意のアクションパスに変更します。
なお-urlの内容は三項演算子を利用しています。 詳細はRuby on Railsで三項演算子を利用する記事から
コントローラー内のcreateとupdateアクションの変数は、@articleに統一しないとエラーになります。
ArticesController def create @article = Article.new(article_params) ~ end def update if @article.update(article_params) ~ end
その他関連記事
Android Studio3をWindowsへインストールする
Nginxでトレイリングスラッシュ (trailing slash)をリダイレクトする
無料で使えるCDN Cloudflare(クラウドフレア)の登録方法を解説
"upstream" directive is not allowed here|Nginxのエラー
Ruby on Railsでsitemapを自動生成しsitemapを自動更新する