LoginSignup
0

More than 3 years have passed since last update.

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

Posted at

まえがき

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

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

編集ページの作成

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

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

で設定してます。

(例)

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
app/views/任意.html.erb
<h1>編集ページ</h1>
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のpostは、フォームデータの取得を行う時に使います。
新規ページ作成ではgetで設定してください。エラーの原因になってしまいます。

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

controllers

app/views/任意.html.erb



def edit
    @forms = Form.find_by(id: params[:id]) ←ここ
end

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

views

app/views/任意.html.erb
<h1>編集ページ</h1>
<div class="form">
  <div>
    <textarea><%= @forms.content %></textarea>  ←ここ
    <input type="submit" value="保存"> </div>
</div>

<%= @forms.content %> により、入力の初期値を設定しています。

編集内容の保存

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

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

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

リダイレクトの設定

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

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

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

Viewsで送信先の指定する

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

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 %> ←ここ

↓ 詳細

app/views/任意.html.erb
<%= form_tag("/posts/#{@post.id}/new") do %>
フォームタグ
<% end %>

↑により、送信先が指定されます。

投稿内容の更新を行う

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

Viewでname属性を指定する

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 で指定

params では、送られてきたデータを保持するオブジェクトを作成できます。

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

    redirect_to("/")
  end

あとがき

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

参考リンク

Ruby on Rails6 実践ガイド

Myリンク

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

Twitter
Portfolio
Github

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0