(Ruby on Rails6) 投稿内容を編集する機能を作る

#まえがき
こちらでは、投稿ページ制作後を前提に"投稿内容を編集"の作業を忘却録として残します。

#投稿内容を編集する機能を作る

##編集ページの作成
routes・controllers・view の3点に、編集ページを新規作成してください
また、ページ作成には

・コントローラー名→ form
・アクション名→ Edit

で設定してます。

(例)

```rb:config/routes
Rails.application.routes.draw do
  get '/' => 'form#index'
  get '/form' => 'form#form'
  post "form/create" => "form#create"
  get "form/:id/edit" => "form#edit" ⇦これ
  get "form/:id" => "form#post"
  # For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html
end
```

```erb:app/views/任意.html.erb
<h1>編集ページ</h1>
```
```rb:app/controllers/任意.controller.rb
class FormController < ApplicationController
  def index
    @forms = Form.all
    @forms = Form.all.order(created_at: :desc)
  end
  def post
    @forms = Form.find_by(id: params[:id])
  end
  def form
    @forms = Form.find_by(id: params[:id])
  end
  def create
    @forms = Form.new(content: params[:content])
    @forms.save 
    @forms = Form.new(title: params[:title])
    @forms.save 
    redirect_to("/")
  end

  def edit ←ここから
   
  end      ←ここまで
end

```

routesの<strong>post</strong>は、フォームデータの取得を行う時に使います。
新規ページ作成では<strong>get</strong>で設定してください。エラーの原因になってしまいます。

##編集ページでの初期値設定(textarea・input)

###controllers

```rb:app/views/任意.html.erb
・
・
・
def edit
    @forms = Form.find_by(id: params[:id]) ←ここ
end
```

editアクションに <strong>@forms = Form.find_by(id: params[:id])</strong> を設定して、URLと同じidのデータを取得させます。


###views

```erb:app/views/任意.html.erb
<h1>編集ページ</h1>
<div class="form">
  <div>
    <textarea><%= @forms.content %></textarea> 　←ここ
    <input type="submit" value="保存"> </div>
</div>
```
<strong><%= @forms.content %></strong> により、入力の初期値を設定しています。

##編集内容の保存

###コントローラーにアクションの追加

フォームから値を受け取るので、routesでは get ではなく <strong>post</strong> で実行してください。

```rb:config/routes.rb
post "form/:id/new" => "form#new"
```

###リダイレクトの設定
アクションにフォームから値を受け取る準備をしたら、submitを押した後に<strong>リダイレクト</strong>させる必要があります。

```rb:app/views/任意.controllers.rb
def new
    redirect_to("/")
end
```

<strong>redirect_to("/")</strong> を利用してリダイレクト設定を行います。 <strong>/</strong> は私が任意で設定しているので個人でアレンジしてください。

##Viewsで送信先の指定する
先により フォームからの値の取得・リダイレクト を行いました。
ここでは、Viewsで送信先を指定します。

```erb:app/views/任意.controllers.erb
<h1>編集ページ</h1>
<%= form_tag("/posts/#{@post.id}/new") do %> ←ここ
<div class="form">
  <div>
    <textarea><%= @forms.title %></textarea> 
    <textarea><%= @forms.content %></textarea> 
    <input type="submit" value="保存"> </div>
</div>
<% end %> ←ここ
```

↓ 詳細

```erb:app/views/任意.html.erb
<%= form_tag("/posts/#{@post.id}/new") do %>
フォームタグ
<% end %>
```
↑により、送信先が指定されます。

##投稿内容の更新を行う
データーベースからデータを取得する必要があります。
取得アクションは、アクション・name属性の追加で行えるので、実行しましょう。

###Viewでname属性を指定する

```erb:app/views/任意.html.erb
<h1>編集ページ</h1>
<%= form_tag("/posts/#{@post.id}/new") do %>
<div class="form">
  <div>
    <textarea name="content"><%= @forms.content %></textarea>  ←ここ
    <input type="submit" value="保存"> </div>
</div>
<% end %>
```

###コントローラーで params と save で指定
<strong>params</strong> では、送られてきたデータを保持するオブジェクトを作成できます。

```rb:app/controllers/任意.controller.rb
def update
    @forms = Form.find_by(id: params[:id])
    @forms.content = params[:content]
    @forms.save
    
    redirect_to("/")
  end
```


#あとがき
ここまで読んでいただき、ありがとうございました。
初期値の設定などの処理が理解できるまで、少し時間がかかりそうですが地道に理解を深めたいと思います。
また、ここの紹介だけでは"投稿ページへのリンク"など詳細を省いてしまってるので、自作されるかたは設定することをおすすめします。

#参考リンク

<a href="https://www.amazon.co.jp/Ruby-Rails-%E5%AE%9F%E8%B7%B5%E3%82%AC%E3%82%A4%E3%83%89-impress-gear/dp/4295008052" target="blank">Ruby on Rails6 実践ガイド</a>


#Myリンク
また、Twitter・Portfolio のリンクがありますので、気になった方は
ぜひ繋がってください。プログラミング学習を共有できるフレンドが出来るととても嬉しいです。

<a href="https://twitter.com/0819_tateishi" target="blank">Twitter</a>
<a href="https://ayu-portfolio.herokuapp.com/" target="blank">Portfolio</a>
<a href="https://github.com/ayu0819" target="blank">Github</a>