【rails】フォームから記事をCRUDする

※本サイトで紹介している商品・サービス等の外部リンクには、アフィリエイト広告が含まれる場合があります。

フォームから記事をCRUDできるようにする

前回:コンソール画面から記事を作成できた

今回:実際に記事投稿フォームから、記事をCRUD(作成・編集・更新・削除)できるようにしていく

app/controllers/articles_controller.rbを開く


記事の作成(new・create)

  • current_userは、「今ログインしているユーザー」を指す
  • 関連性があるときはbuildを使う(newと同じような意味)

articles#newの修正

# 現在
  def index
    @articles = Article.all
  end

空の@articleを作る

# 修正後
  def new
    @article = current_user.articles.build
  end

current_user.articles.buildで空の@articleを作る

↓ 中身がない状態(nil)が出来上がる

User.first.articles.build

<Article id: nil, title: nil, content: nil,
created_at: nil, updated_at: nil, user_id: 4>

articles#createの修正

# 現在
  def create
    @article = Article.new(article_params)
    if @article.save
      redirect_to article_path(@article),
                  notice: '保存できました'
    else
      flash.now[:error] = '保存に失敗しました'
      render :new
    end
  end

空の@articleを作る

# 修正後
  def create
    @article = current_user.articles.build(article_params)
    if @article.save
      redirect_to article_path(@article),
                  notice: '保存できました'
    else
      flash.now[:error] = '保存に失敗しました'
      render :new
    end
  end

current_user.articles.buildで空の@articleを作る


記事の編集・更新(edit・update)

current_user.articlesにより、自分の記事のみ編集対象とする


articles#editの修正

# 現在
  def edit
  end

自分の記事しか取得できないようにしておく

# 修正後
  def edit
    @article = current_user.articles.find(params[:id])
  end

articles#updateの修正

# 現在
  def update
    if @article.update(article_params)
      redirect_to article_path(@article),
                  notice: '更新できました'
    else
      flash.now[:error] = '更新できませんでした'
      render :edit
    end
  end

自分の記事しか取得できないようにしておく

# 修正後
  def update
    @article = current_user.articles.find(params[:id])
    if @article.update(article_params)
      redirect_to article_path(@article),
                  notice: '更新できました'
    else
      flash.now[:error] = '更新できませんでした'
      render :edit
    end
  end


記事の削除(destroy)

current_user.articlesにより、自分の記事のみ削除対象とする


articles#destroyの修正

# 現在
  def destroy
    article = Article.find(params[:id])
    article.destroy!
    redirect_to root_path, notice: '削除に成功しました'
  end

自分の記事しか取得できないようにしておく

# 修正後
  def destroy
    article = current_user.articles.find(params[:id])
    article.destroy!
    redirect_to root_path, notice: '削除に成功しました'
  end

#DAY20