2 flat logo on transparent 256
2018-01-24

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

7445a9c7684c2bd2

登録フォームを設定している場合、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 = @article.new_record? ? artices_path : article_path

上記でartices_pathはcreateアクションのpathで article_pathは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
前の記事
次の記事