気軽に楽しくプログラムと遊ぶ

自分が興味があってためになるかもって思う情報を提供しています。

Rails モデル作成メソッドの実装をscaffoldの実装に近づける(2)

今回はプロゲートの中級 3章の「scaffoldのコードに近付けよう(2)」をやっていきます。

form_tagとform_for

form_tag:モデルオブジェクトに紐付かない検索フォームを表示する場合に用いる。
form_for:モデルオブジェクトの属性を入力フォームに表示する場合に用いる。

form_tagを用いる場合

<%= form_tag note_path(@note.id), method: 'patch' do %>
  タイトル
  <%= text_field_tag 'note[:title]', @note.title, class: "form-control..." %>
  内容
  <%= text_area_tag 'note[:content]', @note.content, class: "form-control..." %>
  <%= submit_tag '保存', class: "btn..."%>

<% end %>

form_forを用いる場合

  • @noteが存在しない場合:createメソッドへ。存在する場合:updateメソッドへ遷移する
  • 初期値も@noteの属性値が自動で設定される。
<%= form_for(@note) do |f| %>
  タイトル
  <%= f.text_field :title, class: "form-control..." %>
  内容
  <%= f.text_area :content class: "form-control..." %>
  <%= f.submit '保存', class: "btn..."%>
<% end %>

パーシャル

コードを見やすくしたり、コードの重複を除去するためにコードの一部を抜き出したファイルのことを
パーシャルと呼ぶ。ファイル名の頭に「_」アンダースコアを付与する。

_form.html.erb

<%= form_for(@note) do |f| %>
  ・・・
<% end %>

呼び出し方

<%= render 'form' %>

Rails updateメソッド

Railsの標準関数のupdateメソッドについての記述方法、動作について確認する。

updateメソッドを用いない場合

def update
  @note.title = params[:note][:title]
  @note.content = params[:note][:content]
  @note.save
  redirect_to note_path(@note.id), notice: '記事は編集されました。'
end

updateメソッドを用いる場合

def update
  # note, title属性を保持したnoteハッシュを受け取り、DBを更新する。
  if @note = update(note_params)
    redirect_to @note, notice: '記事は編集されました。'
  else
    render :edit
  end

  private
  def note_params
    # noteキーのハッシュにおいてtitle,contentのみ許可する。ストリロングパラメータを設定
    params.require(:note).permit(:title, :content)
  end
end

参考URL

Progate | プログラミングの入門なら基礎から学べるProgate (プロゲート)